在Ubuntu上,我正在學習有關cmake和make的知識,并且僅嘗試一個簡單的示例。我有兩個目錄:src和build。在中src,我有兩個文件:main.cpp和和CMakeLists.txt,(僅具有)以下文本:add_executable(test main.cpp)link_directories(/usr/lib/x86_64-linux-gnu)target_link_libraries(test protobuf)在中/usr/lib/x86_64-linux-gnu,有一個共享庫稱為libprotobuf.so,我想對其進行鏈接。我main.cpp通過包含相關的頭文件來使用此庫中的函數#include <google/protobuf/message.h>?,F在,在build目錄中,運行cmake ../src,然后運行make。但是,然后出現鏈接器錯誤,告訴我protobuf庫中某些函數的未定義引用。如果我搜索中的所有文件和子目錄build,則不會提及與protobuf相關的任何內容。但是,如果我刪除文件中的這一link_directories行CMakeLists.txt,而是在指定可執行文件時將完整路徑寫入庫,即target_link_libraries(test /usr/lib/x86_64-linux-gnu/libprotobuf.so),它可以編譯并很好地鏈接。為什么link_directories不允許cmake查找此庫?
3 回答

富國滬深
TA貢獻1790條經驗 獲得超9個贊
不要link_directories在CMake中這樣使用。
這是一個常見的初學者的錯誤,因為許多其他構建環境都可以像這樣工作,但是在CMake中,它只是自找麻煩。甚至聯機幫助頁也特別建議不要這樣做:
注意,此命令[ link_directories]很少需要。find_package()和返回的庫位置find_library()是絕對路徑。將這些絕對庫文件路徑直接傳遞給target_link_libraries() 命令。CMake將確保鏈接器找到它們。
因此,始終將絕對路徑傳遞到target_link_libraries并用于find_library解析鏈接目錄:
find_library(PROTOBUF_LIBRARY protobuf HINTS /usr/lib/x86_64-linux-gnu)
target_link_libraries(test PUBLIC ${PROTOBUF_LIBRARY})
這具有巨大的好處,如果找不到期望的庫,則可能會在CMake配置時進行診斷,而不是在編譯時出現隨機鏈接器錯誤。此外,如果目標計算機的目錄布局不標準,則允許用戶通過GUI指定庫位置。
因此,如果無法立即使用它,請確保檢查find_library調用結果并查閱手冊頁以查找為什么找不到所需的庫。
- 3 回答
- 0 關注
- 3777 瀏覽
添加回答
舉報
0/150
提交
取消