【问题标题】:How do I tell cmake I want my project to link libraries statically?如何告诉 cmake 我希望我的项目静态链接库?
【发布时间】:2011-04-14 21:42:46
【问题描述】:

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

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

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

【问题讨论】:

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


【解决方案1】:

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

set(OpenCV_STATIC ON)
find_package(OpenCV REQUIRED)

【讨论】:

  • 'find_package(OpenCV REQUIRED)' 有什么作用?
  • 这在 Ubuntu 18.04 上对我不起作用。这是在哪个版本中修复的?
【解决方案2】:

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

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

CMake 会处理所有事情。

【讨论】:

  • 这是BUILD_SHARED_LIBS,而不是_LIBRARIES。 :-)
  • 我将 BUILD_SHARED_LIBRARIES 更正为 BUILD_SHARED_LIBS。
  • 至少在 Windows 下的 CLion (CLion 2016.3 EAP) 与 CMake 3.6.1 捆绑在一起,在构建 OpenCV 3.1.0 时,这是此处列出的导致 CMake 构建 OpenCV 的唯一方法作为静态而不是共享库。请注意,尝试通过编辑 CMakeLists.txt 来启用此选项失败;只有通过 CLion 的缓存窗口编辑 CMake 缓存并单击 Apply Changes and Reload Project 图标,我才能让我的 CLion/CMake 组合接受BUILD_SHARED_LIBS。不确定这是否是应记录在案的 CLion 问题。
  • 这仅在您构建 opencv 时才有效。不是在您使用预安装的 opencv 库的情况下。
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

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

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

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

    【讨论】:

    • 我认为 add_library 命令是生成输出二进制文件。在这种情况下,指定 STATIC 会导致它生成 .a。
    • add_library 的static 关键字指定它生成什么类型​​的库,它不适用于生成二进制文件。
    • 也许我理解错了,但我认为 OP 试图链接一个静态库,而不是生成一个。
    • 是的,我没有创建库,我想(静态)链接到 OpenCV 库。
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:
      SET (CMAKE_EXE_LINKER_FLAGS "-static")
      

      【讨论】:

        猜你喜欢
        • 2012-12-14
        • 1970-01-01
        • 1970-01-01
        • 2011-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多