CMake 是否需要静态库(例如 ZLIB)?

Can CMake require static libraries (e.g., ZLIB)?

我在C++工作已经很多年了,而且我以前从未使用过CMake。我正在尝试编译一个名为 ngmlr 的程序,它使用 CMake。它在我尝试构建它的其他系统上无缝运行。这一次,CMake 根据 ngmlr 的要求找到 ZLIB (Found ZLIB: /usr/lib64/libz.so (found version "1.2.3")),但随后的 make 失败并显示 ld: 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专门寻找staticZLIB吗?例如,由于开发人员需要 static,如果能立即知道缺少的 static 库是问题所在就好了,而不是让我花那么长的时间来弄清楚。

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

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

cmake version 2.8.8

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

find_library(ZLIB z)

您可以将其替换为:

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

Now I'm particularly interested to know if the developer can tell CMake to throw an error if the static libraries are not present, and save someone else.

REQUIRED 表示如果找不到包将抛出错误。在你的情况下,如果你在 find_package

之前移动 SET(CMAKE_FIND_LIBRARY_SUFFIXES 应该抛出它

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

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

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