Cmake可以要求静态库(例如Zlib)
Can CMake require static libraries (e.g., ZLIB)?
自从我在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
不可用。
问题:
- 这看起来正确吗?
- 对于教育,假设这是问题,您是否可以强迫
CMake
专门寻找static
ZLIB
?例如,由于开发人员需要static
,因此立即知道丢失的static
库是问题是很高兴的,而不是我弄清楚它花了很长的时间。
我很广泛地寻找两个都明确的答案,但没有找到任何结论性(例如,迫使cmake使用静态库(。
更新我确实确认问题是ld
找不到静态库。现在,我特别想知道开发人员是否可以告诉CMake
如果不存在static
库,并保存其他人。
cmake version 2.8.8
- 是
- 一般来说,这取决于发现模块的作者。有些模块具有特殊的"静态"选项,而另一些模块则没有。特别是Zlib模块还没有。这就是为什么CMAKE Global变量在子目录
src/CMakeLists.txt
:SET(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)
- 为char数组调整zlib-zpipe
- 基于boost的程序的静态链接——zlib问题
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 将数字转换为字母(例如:123 转换为一二三)
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 如何计算数据类型的范围,例如int
- 为什么 zlib 放气初始化调用一次不起作用?
- 这是否符合C++标准:双响双响,例如!!(-0.0).
- 如何将CMSampleBufferRef/CIImage/UIImage转换为像素,例如uint8_t[]
- 使用 make 编译 MPI,几个命名空间错误,例如"错误:未知类型名称'使用'?
- 如何使用文件中的文本,例如变量
- 输入值后,如何在一个括号下显示值,例如"{6,7,8,9}
- 给定一个类型,如何派生一个泛型更广泛的类型(例如,用于溢出安全求和)?
- 初学者问题:如何使用这些晦涩难懂的命令,例如C++中的'RenderWindow'
- C++:将值 int(例如:0x00AAFAD8)转换为指针(指针本身也是 0x00AAFAD8 值)
- 具有多种约束(例如重量、体积等)的背包
- 较高值 n 的分割错误(例如 n=999997)
- 安装 zlib 库仍然丢失错误
- Cmake可以要求静态库(例如Zlib)