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

agn*_*nul 19 linux opencv cmake static-libraries static-linking

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

FIND_PACKAGE (OpenCV REQUIRED)
...
TARGET_LINK_LIBRARIES (my-executable ${OpenCV_LIBS})
Run Code Online (Sandbox Code Playgroud)

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

agn*_*nul 8

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

FIND_PACKAGE (OpenCV REQUIRED)
...
TARGET_LINK_LIBRARIES (your-application ${OpenCV_LIBS})
Run Code Online (Sandbox Code Playgroud)

和CMake将照顾一切.

  • 是`BUILD_SHARED_LIBS`,而不是`_LIBRARIES`。:-) (2认同)
  • 这仅在您构建 opencv 时才有效。不是在您使用预装的 opencv 库的情况下。 (2认同)

jke*_*ian 7

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

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


bco*_*ook 6

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

set(OpenCV_STATIC ON)
find_package(OpenCV REQUIRED)
Run Code Online (Sandbox Code Playgroud)


psz*_*ard 5

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

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

  • 我现在唯一的方法是在 `find_library()` 之前更改搜索到的库后缀:`set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})`。FindBoost 并具有强制使用静态库(`Boost_USE_STATIC_LIBS`)的特殊选项,但它也可以通过更改 `CMAKE_FIND_LIBRARY_SUFFIXES` 在内部工作。 (4认同)