記一次C++編程引用obj文件作為靜態庫文件


簡介

常用靜態庫文件的名字一般是 ***.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卡連接,儀器上電執行結果如下:

儀器斷電執行結果:

總結

  1. 不要陷入思維誤區,一提起靜態庫文件就是 *.lib 有可能廠商提供的就是一個 *.obj 文件;
  2. C代碼與C++代碼兼容性的問題,新手踩坑太少,遇到啥問題都是新問題。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM