简介
常用静态库文件的名字一般是 ***.lib
,例如 nisyscfg.lib
就是一个静态库文件,但是一个例程居然是引用 **.obj
文件作为静态库,有点非常规啊。
这是一个NI488.2 的例程,其中一个例程的说明文档如下:
Microsoft Visual C++ (64-bit)
With Microsoft Visual C++ (Version 8.0 or higher), this is done by
typing in using the 64-bit environment:
cl /I"%NIEXTCCOMPILERSUPP%\include" 4882query.c "%NIEXTCCOMPILERSUPP%\lib64\msvc\ni4882.obj" /MD
在编译命令中可以看出需要设置示例程序包含的头文件路径、库文件路径即可。这里的库文件是 ni4882.obj。按照文档说明设置工程:
unresolved external symbol
新建一个命令行工程,它原本只能输出 Hello World!!!,我打算把示例程序的入口函数改名字为 int __cdecl entry_4882query(void)
作为一个函数引入到命令行 main()
函数中,直接编译却出现了这个错误,一头雾水。
思考了一会儿,刚刚新建工程是 C++
工程,但示例工程全部都是 C 语言写的,难道是这里出现了问题,所以我打算在示例工程源文件收尾加一些东西,如下:
#include "ni4882.h"
#ifdef __cplusplus
extern "C" {
#endif
int __cdecl entry_4882query(void)
{
//.....
}
#ifdef __cplusplus
}
#endif
然而编译之后还是出错。
最后借助于必应,才明白原来源文件和头文件都需要加上 __cplusplus
标记才行。
电脑和仪器之间通过GPIB卡连接,仪器上电执行结果如下:
仪器断电执行结果:
总结
- 不要陷入思维误区,一提起静态库文件就是
*.lib
有可能厂商提供的就是一个*.obj
文件; - C代码与C++代码兼容性的问题,新手踩坑太少,遇到啥问题都是新问题。