0

我正在VS中编写必须导入CVI的lib文件。最近发生了链接器问题。

它说 _allmul() 是一个未定义的符号。

_allmul() 和 freinds 被实现为对 CRT 库函数的调用以处理各种 64 位操作。

我编写的 lib 文件是静态的,因为我希望所有代码都存在于其中。与 VS 链接没问题,所有单元测试都通过了。

与 CVI-IDE 链接会使 CVI Linkter 抱怨未解决的 _allmul()。

我认为在 VS 中设置 /MT 开关足以使 CRT 链接静态化,这似乎是错误的。

为什么我的假设是错误的?如何静态链接 CRT 调用?


编辑:

这是我可以在 VS2010 中编译但我无法在 CVI 中链接到的项目的简短演示 以下被编译为 LIB 项目:

标题

void print( unsigned A, unsigned B );

代码

#include "MyprintInterface.h"

#include <stdio.h>

void print( unsigned A, unsigned B ){
    long long copyA = ( long long ) A;
    long long copyB = ( long long ) B;
    printf_s( " %lli * %lli = %lli ", copyA, copyB, copyA * copyB ); 
    // copyA * copyB -> this invokes allmul
    // printf_s this is a ms specific function
}
4

1 回答 1

1

这有点晚了,但也许它会帮助别人。

在使用带有 LabWindows/CVI的gSoap工具包时,我有非常相似的经历。该工具包生成用于创建 Web 服务客户端或服务器的 ANSI C 绑定。然而,它有时会生成与 CVI 中的原型略有不同的 MS 函数版本(一些已弃用)。解决这个问题有点乏味,但通常遵循以下步骤:

1) 将适当的 Microsoft SDK 安装到您的开发盒上。 这是 Microsoft SDK 的一种选择。(还有其他的,谷歌一下)
2)在 MSDN 网站上搜索未解析的符号,以确定 .lib/.h 支持它。(例如 MSDN 的sprintf变体列表)
3) 包括任何必需的 .lib/.h 文件。
4) 确保 msvcr80.dll 或 msvcr100.dll(或其他适当的)对您的可执行文件可见。(即放置在可执行运行时目录或系统目录中。)

除此之外,我还必须从支持文件写入/读取功能的头文件中引入一些#defines,例如:

#define _O_TEXT         0x4000  /* file mode is text (translated) */     
#define _O_BINARY       0x8000  /* file mode is binary (untranslated) */

并且:(需要安装微软平台SDK c:\program files\microsoft platform sdk\include\crt(复制到项目目录并包含在项目中))

  fcntl.h  (definition for file mode etc., _O_BINARY)
  float.h  (definition for isnan etc.)
  io.h     (definition for setmode etc.)

此外,这里还有一个示例 CVI 项目,其中包含说明我上面描述的内容(包括使用 crt)的源代码

[编辑] 关于在 LabWindows/CVI 中使用第三方库时与 COFF 兼容的 .libs -阅读此处的帖子

[编辑 2] 安装 Windows SDK 后,msvcrxxx.dll 中所有内容的标头都将在您的系统上。但是为了找到特定 API 调用的 .h 依赖项,我通常只在 Google 上搜索它就很幸运:即sprintf_s等。al.,返回的第一个链接是this。它包括有关如何使用 sprintf_s 的注释,包括源代码。

至于 allmul 问题,我以前没有遇到过,但是这个家伙遇到了。

于 2013-08-20T15:33:01.953 回答