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

问题描述 投票:18回答:7

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

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

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

linux opencv cmake static-libraries static-linking
7个回答
7
投票

要静态链接一切,我相信你正在寻找CMAKE_EXE_LINKER_FLAGS(添加-static)。

您使用的是OpenCVConfig.cmake的“简单方法”吗?还是旧的FindOpenCV.cmake?


7
投票

只需在CMake中将BUILD_SHARED_LIBS标志设置为false,即可构建静态OpenCV库。然后,您需要做的就是使用这些静态库构建自己的应用程序,就是在CMakeLists.txt中添加对OpenCV的依赖:

FIND_PACKAGE (OpenCV REQUIRED)
...
TARGET_LINK_LIBRARIES (your-application ${OpenCV_LIBS})

和CMake将照顾一切。


6
投票

实际上这个问题似乎已经在OpenCV附带的OpenCVConfig.cmake中修复了。你所要做的就是在你的OpenCV_STATIC中定义CMakeLists.txt。即

set(OpenCV_STATIC ON)
find_package(OpenCV REQUIRED)

4
投票

AFAIK有点棘手,因为CMake,更确切地说是find_library命令,更喜欢共享库,如果共享和静态都可用,则会找到它们。

我仍然在寻找一个好的解决方案,能够“尽可能静态地”编译二进制文件,但我还没有找到优雅的解决方案。唯一可行的方法是通过自定义FindXXXX模块实现所有功能。


2
投票

在add_library行上指定static。见http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:add_library

更正因为你想要链接静态库我会查看CMAKE_FIND_LIBRARY_SUFFIXES属性


1
投票

请注意,如果传递-static选项,gcc拒绝链接,但是你在链接参数中有动态库 - 如果你只是使用FindOpenCV.cmake,你会选择动态库(我不知道如何使用OpenCVConfig) .cmake虽然行为)...


0
投票
SET (CMAKE_EXE_LINKER_FLAGS "-static")
© www.soinside.com 2019 - 2024. All rights reserved.