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