【问题标题】:Can CMake require static libraries (e.g., ZLIB)?CMake 是否需要静态库(例如 ZLIB)?
【发布时间】:2017-06-23 23:32:24
【问题描述】:

我在C++ 工作已经有好几年了,我之前从未使用过CMake。我正在尝试编译一个名为ngmlr 的程序,它使用CMake。它可以在我尝试构建的其他系统上无缝运行。这一次,CMake 按照ngmlr 的要求找到了ZLIB (Found ZLIB: /usr/lib64/libz.so (found version "1.2.3")),但随后的makeld: cannot find -lz 失败。

认为我知道发生了什么:CMake 找到了动态的 ZLIB 库 (libz.so),但 CMakeLists.txt 文件需要 static(我在文件:option(STATIC "Build static binary" ON))。据我所知,这台机器上缺少静态库 (libz.a)。它与libz.so 不在同一个/usr/lib64 目录中。 locate 不可用。

问题:

  1. 这看起来正确吗?
  2. 对于教育,假设这是问题所在,你能否强制CMake 专门寻找static ZLIB?例如,由于开发人员需要 static,因此最好立即知道缺少的 static 库是问题所在,而不是我花了很长的时间才弄明白。

我已经广泛寻找这两个问题的明确答案,但没有找到任何结论性的答案(例如,Force cmake to use static libraries)。

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

cmake version 2.8.8

【问题讨论】:

  • 对于如何改进我的问题的任何反馈,我将不胜感激。

标签: c++ static cmake zlib


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

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

REQUIRED 表示如果找不到包将抛出错误。在你的情况下,如果你在find_package 之前移动SET(CMAKE_FIND_LIBRARY_SUFFIXES,它应该被抛出

如果禁用STATIC 选项,也许您可​​以构建您的项目

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

【讨论】:

  • 是的,我将SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a") 移动到find_package( ZLIB REQUIRED ) 之前,这会引发相应的错误!我能够通过禁用静态来完成项目的构建。
  • 我可以通过这样做获得静态版本,以防这对其他人有帮助: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)
  • @GenericAccountName 这真的应该写成答案。
  • @Someprogrammerdude 已经有一个接受的答案,我不确定它是否会有所帮助,但我也很乐意将其添加为答案。感谢您的意见。
【解决方案2】:

我不是 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)

【讨论】:

    【解决方案3】:

    您的CMakeLists.txt 可能在某个地方有这个:

    find_library(ZLIB z)
    

    您可以将其替换为:

    find_library(ZLIB libz.a)
    

    【讨论】:

    • 感谢您的建议。我不确定我是否做错了什么,但这似乎不起作用。现有电话是find_package( ZLIB REQUIRED )。我尝试了find_package( ZLIB REQUIRED libz.a ),但我仍然看到得到以下结果:Found ZLIB: /usr/lib64/libz.so (found version "1.2.3")。我还尝试将find_package 更改为find_library,但这似乎根本找不到zlib(CMake 也不会抛出错误)。对于zlib 函数(例如gzopen),我确实遇到了未定义的编译器错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多