CMake 包含了頭文件 找到了so動態庫 鏈接時仍然出現undefined reference to 錯誤

今天遇到一個CMake 鏈接問題,這裏提出來和大家分享:
問題:
自己用C語言寫了一個動態:libword-counter.so,公開頭文件word-counter.h, 其中有函數如:wc_get_word_freq()
自己用C++語言寫了一個測試工程,在main函數中調用上述庫函數wc_get_word_freq。
結果出現undefined reference to 的錯誤

分析:
1. 根據Cmake的編譯log,可以看出該錯誤是在linking target的時候出現的,因此build是OK的
2. 如果修改頭文件爲其他文件,則出現找不到文件的錯誤,因此說明頭文件可以正常找到。也在次說明1中build是沒問題的
3. 編譯選項我已經指明瞭需要加載的庫 -lword-counter
4. 如果修改3中的庫名,則出現找不到so的錯誤,說明3中編譯選項是沒問題的,系統能找到這個庫so
5. 現在出現問題“undefined reference to 的錯誤”,太詭異了?
6. 本人一直堅信,計算機不會出現靈異事件,因此不斷請教度娘
7. 發現有人建議我用nm命令查看so的符號表,看看這個函數是否正常,於是nm -D 庫文件,查看了下,結果函數正常的。
8. 最後想到C++調用C存在混編問題,有人建議編譯選項加上 -lstdc++,結果還是不行
9. 最終沿着混編問題走下去,我找到了原因,需要在庫文件的頭文件中加上下面的語句,用以指定,在編譯C++的時候被調用的代碼仍然使用C編譯選項。

#ifdef __cplusplus
extern "C"
{
#endif



問題解決,希望遇到問題的小夥伴能看到,少走彎路~~

 

補充:

今天又遇到一個類似問題,找不到函數聲明,extern c沒問題,最終利用步驟7,發現so中沒有符號表。

root cause:函數沒有export出去

 

#ifndef EXPORT_API
#define EXPORT_API __attribute__((visibility("default")))
#endif


EXPORT_API
int get_download_info()

{

}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章