我如何告诉cmake我希望我的项目静态链接库?

时间:2010-09-20 21:02:07

标签: linux opencv cmake static-libraries static-linking

我正在尝试使用在Linux上运行的CMake构建基于OpenCV的项目。到目前为止,我的CMakeLists.txt文件看起来像

FIND_PACKAGE (OpenCV REQUIRED)
...
TARGET_LINK_LIBRARIES (my-executable ${OpenCV_LIBS})

但这导致动态链接库。如何链接静态库?

7 个答案:

答案 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)

add_library行上的

指定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")