CMake可以要求静态库(例如,ZLIB)吗?

时间:2017-06-23 23:32:24

标签: c++ static cmake zlib

我在C++工作多年以来,我以前从未使用CMake。我正在尝试编译一个名为ngmlr的程序,该程序使用CMake。它在我试图构建它的其他系统上无缝地工作。这一次,CMake根据ZLIB的要求找到Found ZLIB: /usr/lib64/libz.so (found version "1.2.3")ngmlr),但随后的make失败并显示ld: cannot find -lz

我知道发生了什么:CMake找到了动态ZLIB库(libz.so),但CMakeLists.txt文件需要{{ 1}}(我在文件中找到了以下选项:static)。据我所知,这台机器上缺少静态库(option(STATIC "Build static binary" ON))。它与libz.a不在同一/usr/lib64目录中。 libz.so无效。

问题:

  1. 这看起来是否正确?
  2. 对于教育,假设这是问题,您可以强制locate专门查看CMake static吗?例如,既然开发人员需要ZLIB,那么立即知道丢失的static库是问题,而不是花费我很长时间才能弄清楚它,这本来是很好的。
  3. 我已经广泛地寻找两者的明确答案,但没有找到任何结论(例如,Force cmake to use static libraries)。

    更新 我确实确认问题是static无法找到静态库。现在我特别想知道如果ld库不存在,开发人员是否可以告诉CMake抛出错误,并保存其他人。

    static

3 个答案:

答案 0 :(得分:2)

  1. 一般来说,这取决于Find-module作者。有些模块有特殊的“静态”选项,有些模块没有。特别是Zlib模块没有。这就是cmake全局变量在子目录src/CMakeLists.txt中设置的原因:SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")。但是在find_package( ZLIB REQUIRED )命令之后调用它。看起来像个bug。
  2.   

    现在我特别想知道如果静态库不存在,开发人员是否可以告诉CMake抛出错误,并保存其他人。

    REQUIRED表示如果找不到包,则会抛出错误。在您的情况下,如果您在SET(CMAKE_FIND_LIBRARY_SUFFIXES

    之前移动find_package,则应该抛出它

    如果禁用STATIC选项

    ,也许您可​​以构建项目
    cmake -G"Unix Makefiles" _PATH_ -DSTATIC=OFF
    

答案 1 :(得分:1)

我不是cmake专家,但万一这可以帮助任何人。我发现设置CMAKE_FIND_LIBRARY_SUFFIXES成功加载了静态库,但是我只想找到ZLIB,所以我保存了先前的值,设置了CMAKE_FIND_LIBRARY_SUFFIXES并像这样重置它:

set(_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
set(CMAKE_FIND_LIBRARY_SUFFIXES "static.lib") 
find_package(ZLIB ${ZLIB_VERSION} REQUIRED MODULE) 
set(CMAKE_FIND_LIBRARY_SUFFIXES ${_CMAKE_FIND_LIBRARY_SUFFIXES}) 
unset(_CMAKE_FIND_LIBRARY_SUFFIXES)

答案 2 :(得分:-1)

你的CMakeLists.txt可能有这个地方:

find_library(ZLIB z)

您可以将其替换为:

find_library(ZLIB libz.a)