Qt Creator調用C語言編譯的.So動態庫

    幫別人做個項目,有個傳感器必須用到賣家提供的動態庫。動態庫是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/


發佈了48 篇原創文章 · 獲贊 66 · 訪問量 33萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章