CMake 是否需要静态库(例如 ZLIB)?
Can CMake require static libraries (e.g., ZLIB)?
我在C++
工作已经很多年了,而且我以前从未使用过CMake
。我正在尝试编译一个名为 ngmlr 的程序,它使用 CMake
。它在我尝试构建它的其他系统上无缝运行。这一次,CMake
根据 ngmlr
的要求找到 ZLIB
(Found ZLIB: /usr/lib64/libz.so (found version "1.2.3")
),但随后的 make
失败并显示 ld: cannot find -lz
。
我认为我知道发生了什么: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
库是问题所在就好了,而不是让我花那么长的时间来弄清楚。
我已经广泛地寻找了对这两个问题的明确答案,但没有找到任何结论(例如,Force cmake to use static libraries)。
更新
我确实确认问题是 ld
找不到静态库。现在我特别想知道如果 static
库不存在,开发人员是否可以告诉 CMake
抛出错误,并保存其他人。
cmake version 2.8.8
你的 CMakeLists.txt
可能在某个地方有这个:
find_library(ZLIB z)
您可以将其替换为:
find_library(ZLIB libz.a)
- 是
- 一般来说,这取决于查找模块的作者。有些模块有特殊的 "static" 选项,有些则没有。特别是 Zlib 模块还没有。这就是为什么在子目录
src/CMakeLists.txt
: SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
中设置 cmake 全局变量的原因。但它是在 find_package( ZLIB REQUIRED )
命令之后调用的。看起来像一个错误。
Now I'm particularly interested to know if the developer can tell CMake to throw an error if the static libraries are not present, and save someone else.
REQUIRED
表示如果找不到包将抛出错误。在你的情况下,如果你在 find_package
之前移动 SET(CMAKE_FIND_LIBRARY_SUFFIXES
应该抛出它
如果禁用 STATIC
选项,也许您可以构建您的项目
cmake -G"Unix Makefiles" _PATH_ -DSTATIC=OFF
我不是 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)
我在C++
工作已经很多年了,而且我以前从未使用过CMake
。我正在尝试编译一个名为 ngmlr 的程序,它使用 CMake
。它在我尝试构建它的其他系统上无缝运行。这一次,CMake
根据 ngmlr
的要求找到 ZLIB
(Found ZLIB: /usr/lib64/libz.so (found version "1.2.3")
),但随后的 make
失败并显示 ld: cannot find -lz
。
我认为我知道发生了什么: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
库是问题所在就好了,而不是让我花那么长的时间来弄清楚。
我已经广泛地寻找了对这两个问题的明确答案,但没有找到任何结论(例如,Force cmake to use static libraries)。
更新
我确实确认问题是 ld
找不到静态库。现在我特别想知道如果 static
库不存在,开发人员是否可以告诉 CMake
抛出错误,并保存其他人。
cmake version 2.8.8
你的 CMakeLists.txt
可能在某个地方有这个:
find_library(ZLIB z)
您可以将其替换为:
find_library(ZLIB libz.a)
- 是
- 一般来说,这取决于查找模块的作者。有些模块有特殊的 "static" 选项,有些则没有。特别是 Zlib 模块还没有。这就是为什么在子目录
src/CMakeLists.txt
:SET(CMAKE_FIND_LIBRARY_SUFFIXES ".a")
中设置 cmake 全局变量的原因。但它是在find_package( ZLIB REQUIRED )
命令之后调用的。看起来像一个错误。
Now I'm particularly interested to know if the developer can tell CMake to throw an error if the static libraries are not present, and save someone else.
REQUIRED
表示如果找不到包将抛出错误。在你的情况下,如果你在 find_package
SET(CMAKE_FIND_LIBRARY_SUFFIXES
应该抛出它
如果禁用 STATIC
选项,也许您可以构建您的项目
cmake -G"Unix Makefiles" _PATH_ -DSTATIC=OFF
我不是 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)