簡介
常用靜態庫文件的名字一般是 ***.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++代碼兼容性的問題,新手踩坑太少,遇到啥問題都是新問題。