我正在尝试使用在Linux上运行的CMake构建一个基于OpenCV的项目。到目前为止,我的CMakeLists.txt
文件看起来像
FIND_PACKAGE (OpenCV REQUIRED)
...
TARGET_LINK_LIBRARIES (my-executable ${OpenCV_LIBS})
但这导致动态链接库。如何链接静态库?
要静态链接一切,我相信你正在寻找CMAKE_EXE_LINKER_FLAGS
(添加-static
)。
您使用的是OpenCVConfig.cmake的“简单方法”吗?还是旧的FindOpenCV.cmake?
只需在CMake中将BUILD_SHARED_LIBS
标志设置为false,即可构建静态OpenCV库。然后,您需要做的就是使用这些静态库构建自己的应用程序,就是在CMakeLists.txt
中添加对OpenCV的依赖:
FIND_PACKAGE (OpenCV REQUIRED)
...
TARGET_LINK_LIBRARIES (your-application ${OpenCV_LIBS})
和CMake将照顾一切。
实际上这个问题似乎已经在OpenCV附带的OpenCVConfig.cmake
中修复了。你所要做的就是在你的OpenCV_STATIC
中定义CMakeLists.txt
。即
set(OpenCV_STATIC ON)
find_package(OpenCV REQUIRED)
AFAIK有点棘手,因为CMake,更确切地说是find_library命令,更喜欢共享库,如果共享和静态都可用,则会找到它们。
我仍然在寻找一个好的解决方案,能够“尽可能静态地”编译二进制文件,但我还没有找到优雅的解决方案。唯一可行的方法是通过自定义FindXXXX模块实现所有功能。
在add_library行上指定static。见http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:add_library
更正因为你想要链接静态库我会查看CMAKE_FIND_LIBRARY_SUFFIXES属性
请注意,如果传递-static选项,gcc拒绝链接,但是你在链接参数中有动态库 - 如果你只是使用FindOpenCV.cmake,你会选择动态库(我不知道如何使用OpenCVConfig) .cmake虽然行为)...
SET (CMAKE_EXE_LINKER_FLAGS "-static")