Cmake可以要求静态库(例如Zlib)

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

本文关键字:例如 Zlib 静态 Cmake      更新时间:2023-10-16

自从我在C++工作以来已经有几年了,而且我以前从未使用过CMake。我正在尝试编译使用CMake的名为NGMLR的程序。它在我尝试构建的其他系统上无缝地工作。这次,CMake根据ngmlr的要求找到ZLIB(Found ZLIB: /usr/lib64/libz.so (found version "1.2.3")(,但是随后的make使用ld: cannot find -lz失败。

i think 我知道发生了什么: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库是问题是很高兴的,而不是我弄清楚它花了很长的时间。

我很广泛地寻找两个都明确的答案,但没有找到任何结论性(例如,迫使cmake使用静态库(。

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

cmake version 2.8.8

  1. 一般来说,这取决于发现模块的作者。有些模块具有特殊的"静态"选项,而另一些模块则没有。特别是Zlib模块还没有。这就是为什么CMAKE Global变量在子目录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

我不是CMAKE专家,但是如果这对任何人有帮助。我发现设置CMAKE_FIND_LIBRARY_SUFFIXES成功加载了静态lib,但我只想找到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)

您的CMakeLists.txt可能有一个地方:

find_library(ZLIB z)

您可以替换为:

find_library(ZLIB libz.a)