如何在CMake中找到zlib的静态版本?

And*_*lus 8 zlib cmake

我使用的是 cmake 版本 3.12.1,想要构建一个使用 ZLIB 的静态可执行文件。我的机器上有静态(libz.a)和共享(libz.so)库。我如何知道find_package(ZLIB)返回静态版本?也许还有另一种方法可以找到libz.a

我目前的解决方法是指定:

SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static")

然后:

target_link_libraries (my_binary z lib1 lib2)

也欢迎对这种方法提出批评!

小智 7

从 CMake 3.24 开始,使用:set(ZLIB_USE_STATIC_LIBS "ON")

来源


squ*_*les 6

对于cmake_minimum_required< 3.24

考虑到 调用的 CMake 模块的限制,您的方法是有效的find_package(ZLIB),特别是FindZLIB.cmake。虽然其他FindXXX.cmake模块有一个特殊的选项来获取静态库,但 zlib 模块没有。

SO 上已经有一些关于这个主题的问题,但有些问题比其他问题更老,所以有一些选择。

您可以通过将标志添加到调用中-static来更精细地应用该标志(而不是编辑全局CMAKE_EXE_LINKER_FLAGS变量)target_link_libraries。这样,它将仅适用于该目标——如果您正在构建其他非静态目标,则很有用。

您还可以通过设置 来告诉 CMake 显式搜索静态库CMAKE_FIND_LIBRARY_SUFFIXES。调用时find_package,CMake 可以搜索以.a以下方式结尾的库:

SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
find_package(ZLIB REQUIRED) 
Run Code Online (Sandbox Code Playgroud)