2017-06-23 41 views
0

自從我在C++工作多年以來,我從未使用過CMake。我試圖編譯一個名爲ngmlr的程序,它使用CMake。它在我試圖建立它的其他系統上無縫地工作。這一次,CMake找到ZLIBFound ZLIB: /usr/lib64/libz.so (found version "1.2.3")),按照ngmlr的要求,但隨後的makeld: cannot find -lz而失敗。CMake是否需要靜態庫(例如ZLIB)?

認爲我知道發生了什麼:CMake發現動態ZLIB庫(libz.so),但CMakeLists.txt文件需要static(我發現文件中的下列選項:option(STATIC "Build static binary" ON))。據我所知,這臺機器上缺少靜態庫(libz.a)。它不在與libz.so相同的/usr/lib64目錄中。 locate不可用。

問題:

  1. 不似乎正確的嗎?
  2. 對於教育,假設這是問題,你能強制CMake專門尋找staticZLIB?例如,由於開發人員需要static,所以很快就會很高興立即知道缺失的static庫是問題所在,而不是我花費很長時間才弄明白的。

我已經廣泛地尋找了兩個明確的答案,但沒有發現任何結論性的(例如,Force cmake to use static libraries)。

UPDATE 我沒有確認問題是ld找不到靜態庫。現在我特別想知道如果static庫不存在,開發人員是否可以告知CMake發生錯誤,並保存其他人。

cmake version 2.8.8

+0

我很感激我如何能提高我的問題的任何反饋您的項目應該被拋出。 –

回答

1
  1. 一般來說它是由Find-模塊作者。一些模塊有特殊的「靜態」選項,其他模塊則沒有。特別是Zlib模塊還沒有。這就是cmake全局變量設置在子目錄src/CMakeLists.txtSET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")中的原因。但是它在find_package(ZLIB REQUIRED)命令後被調用。看起來像一個錯誤。

現在我特別想知道,如果開發商能告訴CMake的拋出一個錯誤,如果靜態庫不存在,並保存別人。

REQUIRED表示如果未找到包,則會引發錯誤。在你的情況,如果你以前find_package

移動SET(CMAKE_FIND_LIBRARY_SUFFIXES也許你可以建立,如果禁用STATIC選項

cmake -G"Unix Makefiles" _PATH_ -DSTATIC=OFF 
+1

是的,我將'SET(CMAKE_FIND_LIBRARY_SUFFIXES「.a」)'移到'find_package(ZLIB REQUIRED)'之前,並且會引發相應的錯誤!我能夠通過禁用靜態來完成項目的構建。 –

0

CMakeLists.txt可能有這樣的話:

find_library(ZLIB z) 

您可以將其替換爲:

find_library(ZLIB libz.a) 
+0

感謝您的建議。我不確定我是否做錯了什麼,但這似乎不起作用。現有的調用是'find_package(ZLIB REQUIRED)'。我嘗試了'find_package(ZLIB REQUIRED libz.a)',但我仍然看到以下結果:'找到ZLIB:/usr/lib64/libz.so(找到版本「1.2.3」)'。我也嘗試將'find_package'改爲'find_library',但是根本沒有找到'zlib'(CMake也沒有拋出錯誤)。我確實遇到了'zlib'函數未定義的編譯錯誤(例如'gzopen')。 –