我在C++
工作多年以来,我以前从未使用CMake
。我正在尝试编译一个名为ngmlr的程序,该程序使用CMake
。它在我试图构建它的其他系统上无缝地工作。这一次,CMake
根据ZLIB
的要求找到Found ZLIB: /usr/lib64/libz.so (found version "1.2.3")
(ngmlr
),但随后的make
失败并显示ld: cannot find -lz
。
我想我知道发生了什么:CMake
找到了动态ZLIB
库(libz.so
),但CMakeLists.txt
文件需要{{ 1}}(我在文件中找到了以下选项:static
)。据我所知,这台机器上缺少静态库(option(STATIC "Build static binary" ON)
)。它与libz.a
不在同一/usr/lib64
目录中。 libz.so
无效。
问题:
locate
专门查看CMake
static
吗?例如,既然开发人员需要ZLIB
,那么立即知道丢失的static
库是问题,而不是花费我很长时间才能弄清楚它,这本来是很好的。我已经广泛地寻找两者的明确答案,但没有找到任何结论(例如,Force cmake to use static libraries)。
更新
我确实确认问题是static
无法找到静态库。现在我特别想知道如果ld
库不存在,开发人员是否可以告诉CMake
抛出错误,并保存其他人。
static
答案 0 :(得分:2)
src/CMakeLists.txt
中设置的原因:SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
。但是在find_package( ZLIB REQUIRED )
命令之后调用它。看起来像个bug。现在我特别想知道如果静态库不存在,开发人员是否可以告诉CMake抛出错误,并保存其他人。
REQUIRED
表示如果找不到包,则会抛出错误。在您的情况下,如果您在SET(CMAKE_FIND_LIBRARY_SUFFIXES
find_package
,则应该抛出它
如果禁用STATIC
选项
cmake -G"Unix Makefiles" _PATH_ -DSTATIC=OFF
答案 1 :(得分:1)
我不是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)
答案 2 :(得分:-1)
你的CMakeLists.txt
可能有这个地方:
find_library(ZLIB z)
您可以将其替换为:
find_library(ZLIB libz.a)