亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Cmake無法使用“ link_directories”找到庫

Cmake無法使用“ link_directories”找到庫

C++
慕虎7371278 2019-10-18 10:57:29
在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調用結果并查閱手冊頁以查找為什么找不到所需的庫。


查看完整回答
反對 回復 2019-10-18
  • 3 回答
  • 0 關注
  • 3777 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號