我该如何告诉CMake我想要我的项目静态链接库?

26

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

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

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


你如何将"CMake指向静态OpenCV构建"? 我的构建包含静态和共享库。 - Adi Shavit
请查看以下链接以获取答案:https://dev59.com/SW865IYBdhLWcg3wkPWD#10709424 - agnul
7个回答

13

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

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

而 CMake 将会处理所有事情。


3
应该使用BUILD_SHARED_LIBS,而不是_LIBRARIES。 :-) - Ela782
我将BUILD_SHARED_LIBRARIES更正为BUILD_SHARED_LIBS。 - CODE-REaD
至少在Windows下使用CLion(CLion 2016.3 EAP),它捆绑了CMake 3.6.1,当构建OpenCV 3.1.0时,这是列出的方法中唯一能够使CMake构建OpenCV为静态库而不是共享库的方式。请注意,尝试通过编辑CMakeLists.txt启用此选项失败了;只有通过编辑CLion的缓存窗口并单击“应用更改并重新加载项目”图标,我才能让我的CLion/CMake组合接受BUILD_SHARED_LIBS。不确定这是否是应该记录的CLion问题。 - CODE-REaD
3
只有在构建opencv时才有效,如果使用预安装的opencv库则无效。 - simplename

13

实际上,这个问题似乎已经在随OpenCV一起提供的OpenCVConfig.cmake中得到了解决。您只需要在CMakeLists.txt中定义OpenCV_STATIC即可。

set(OpenCV_STATIC ON)
find_package(OpenCV REQUIRED)

“find_package(OpenCV REQUIRED)” 这段代码是做什么的? - James
1
这在我的Ubuntu 18.04上不起作用。这个问题是在哪个版本中修复的? - iliis

6

如果您希望将所有内容静态链接,我认为您需要使用CMAKE_EXE_LINKER_FLAGS(添加-static)。

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


5
据我所知,这有点棘手,因为CMake,更确切地说是find_library命令,更喜欢共享库并在两者都可用时找到它们。 我自己仍在寻找一个好的解决方案,以便能够尽可能“静态”地编译二进制文件,但我还没有找到优雅的解决方案。唯一肯定有效的方法是通过自定义FindXXXX模块来实现所有内容。

5
我唯一知道的方法是更改搜索库后缀: set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX}) 在使用find_library()之前。FindBoost具有特殊选项来强制使用静态库(Boost_USE_STATIC_LIBS),但它也通过更改CMAKE_FIND_LIBRARY_SUFFIXES内部工作。 - marcin

3

我认为add_library命令是用来生成输出二进制文件的。在这种情况下,指定STATIC会使其生成.a文件。 - jkerian
static关键字用于add_library函数,指定生成的库类型,而不是生成二进制文件时使用。 - RobertJMaynard
也许我误解了,但我认为OP试图链接静态库,而不是生成静态库。 - jkerian
是的,我不是在创建一个库,我想(静态地)链接到OpenCV库。 - agnul

1
请注意,如果您在链接参数中有动态库(如果您只是简单地使用FindOpenCV.cmake并且它选择了动态库),则 gcc会拒绝链接,即使您传递了-static选项。(不过我不知道OpenCVConfig.cmake的行为如何)...

-1
SET (CMAKE_EXE_LINKER_FLAGS "-static")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接