幫別人做個項目,有個傳感器必須用到賣家提供的動態庫。動態庫是libS8.so,頭文件是s8.h。
剛開始做的時候,使用QLibrary進行加載這個動態庫,發現始終加載不到,帶着鬱悶去問了賣家~結果他們說搞這個產品的工程師離職了,這實在太坑了。
這時候的錯誤是這樣的:我已經在.pro文件中添加了庫的地址,以及在需要用到庫文件的那個頭文件當中引用了"s8.h"。這時候說,使用的那個庫文件中的函數並未定義。
問題是這樣的:
undefined reference to `function(int)'
沒辦法,我只能自食其力了,上度娘找找~資料倒是挺多的,在Qt Creator中調用C語言編譯的動態庫文件卻很少。好歹找到了個方法,說是必須在.cpp中添加extern "C"。
我自然是照着這個做了,我在需要引用動態庫的.cpp文件中加入extern "C" int function(int);結果報了一個錯誤:
ms.h:29: error: previous declaration of 'int function(int)' with 'C++' linkage
main.cpp:24: error: conflicts with new declaration with 'C' linkage
這個錯誤的意思是,你已經引用了頭文件了,在.cpp中extern後就重複引用了。因此,解決辦法是將引用的頭文件s8.h刪掉。
這時候再運行發現可以了。我又想了一下,如果這麼寫的話,那我直接在庫文件的頭文件當中添加extern "C"不就行了,就不用使用的時候都再引用一下。
果然在動態庫的頭文件中添加extern "C",效果也是一樣的:
extern "C" int function(int funname);
當然還有個更簡便的辦法,直接添加:
extern "C"{
#include "libS8.h"
}
注:
在Qt Creator中的.pro裏面添加的動態庫地址是這樣的,可以在裏面右鍵一步步添加:
win32:CONFIG(release, debug|release): LIBS += -L$$PWD/release/ -lS8
else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/debug/ -lS8
else:unix: LIBS += -L$$PWD/ -lS8
INCLUDEPATH += $$PWD/
DEPENDPATH += $$PWD/