我正在使用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)
也欢迎对此方法提出批评!
鉴于find_package(ZLIB)
,特别是FindZLIB.cmake
调用的CMake模块的局限性,您的方法有效。其他FindXXX.cmake
模块具有用于获取静态库的特殊选项,而zlib模块则没有。
关于这个主题,已经有一些关于SO的问题,但是有些问题比其他的早,因此有一些选择。
您可以通过将-static
标志添加到您的CMAKE_EXE_LINKER_FLAGS
调用中,而在更精细的级别上应用它(而不是编辑全局target_link_libraries
变量)。这样,它仅适用于该目标-在构建其他非静态目标时很有用。
您还可以通过设置CMAKE_FIND_LIBRARY_SUFFIXES
告诉CMake明确搜索静态库。调用CMAKE_FIND_LIBRARY_SUFFIXES
时,CMake可以使用以下命令搜索以find_package
结尾的库:
.a