25

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

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

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

4

7 回答 7

11

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

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

CMake 会处理一切。

于 2012-05-22T20:10:12.480 回答
11

实际上,这个问题似乎已经在OpenCVConfig.cmakeOpenCV 附带的版本中得到解决。您所要做的就是OpenCV_STATIC在您的CMakeLists.txt. IE

set(OpenCV_STATIC ON)
find_package(OpenCV REQUIRED)
于 2014-11-13T23:40:22.157 回答
6

要静态链接所有内容,我相信您正在寻找CMAKE_EXE_LINKER_FLAGS(添加-static)。

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

于 2010-09-20T21:37:12.417 回答
5

AFAIK 这有点棘手,因为 CMake,更准确地说是 find_library 命令,更喜欢共享库并在共享库和静态库都可用的情况下找到那些库。

我自己仍在寻找一个好的解决方案,以便能够“尽可能静态地”编译二进制文件,但我还没有找到优雅的解决方案。它肯定会起作用的唯一方法是通过自定义 FindXXXX 模块实现所有内容。

于 2010-09-21T13:34:08.140 回答
3

在 add_library 行上指定静态。见https://cmake.org/cmake/help/latest/command/add_library.html

更正,因为您要链接到静态库,所以我会查看 CMAKE_FIND_LIBRARY_SUFFIXES属性

于 2010-09-20T21:52:22.487 回答
1

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

于 2010-09-21T14:35:07.390 回答
-1
SET (CMAKE_EXE_LINKER_FLAGS "-static")
于 2019-03-06T07:29:41.047 回答