2017-06-23 39 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')。 –