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