2010-09-20 123 views
17

我想在Linux上运行使用CMake构建一个基于OpenCV的项目。到目前为止,我CMakeLists.txt文件看起来像我如何告诉cmake我希望我的项目静态链接库?

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

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

+0

您如何指出“静态OpenCV构建CMake”?我的版本有静态和共享库。 – 2012-05-17 19:53:53

+0

请参阅下面的答案:http://stackoverflow.com/a/10709424/6069 – agnul 2012-05-22 20:12:03

回答

9

通过在CMake中将BUILD_SHARED_LIBS标志设置为false,可以构建静态OpenCV库。然后,所有你需要做这些静态库来构建自己的应用程序是添加在您的CMakeLists.txt上OpenCV的依赖:

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

和CMake的会照顾一切。

+0

它是'BUILD_SHARED_LIBS',而不是'_LIBRARIES'。 :-) – Ela782 2015-12-31 21:36:36

+0

我将BUILD_SHARED_LIBRARIES更正为BUILD_SHARED_LIBS。 – 2016-09-10 18:28:34

+0

至少在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有关,应该记录在案。 – 2016-09-10 20:25:33

8

要链接一切静态,我相信你正在寻找CMAKE_EXE_LINKER_FLAGS(添加-static)。

您是否使用OpenCVConfig.cmake的'简单方法'?或较旧的FindOpenCV.cmake?

1

在add_library行指定静态。见http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:add_library

修正,因为你正在寻找对静态库我会考虑的 CMAKE_FIND_LIBRARY_SUFFIXES财产

+0

我认为add_library命令是要生成一个输出二进制文件。在这种情况下,指定STATIC将导致它生成.a。 – jkerian 2010-09-20 22:52:39

+0

add_library的static关键字指定它生成的库的类型,它不是在生成二进制文件时使用的。 – RobertJMaynard 2010-09-20 23:11:56

+0

也许我误解了,但我认为OP是试图链接一个静态库,而不是生成一个。 – jkerian 2010-09-20 23:36:41

2

据我所知,这是一个有点棘手,因为CMake的,更准确的find_library命令,宁愿共享库,并发现这些链接如果共享和静态都可用。

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

+1

现在,我唯一的方法是更改​​搜索库后缀: 'set(CMAKE_FIND_LIBRARY_SUFFIXES $ {CMAKE_STATIC_LIBRARY_SUFFIX})' 'find_library()'之前。 FindBoost有强制使用静态库('Boost_USE_STATIC_LIBS')的特殊选项,但它也可以通过更改'CMAKE_FIND_LIBRARY_SUFFIXES'在内部工作。 – marcin 2013-09-03 13:09:16

1

注意GCC拒绝,如果你通过-static选项链接,但你必须在链接参数动态库 - 你会如果你只是简单地使用FindOpenCV.cmake这拿起动态库(我不知道OpenCVConfig.cmake的行为如何)...

4

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

set(OpenCV_STATIC ON) 
find_package(OpenCV REQUIRED) 
+0

'find_package(OpenCV REQUIRED)'是做什么的? – James 2015-07-14 00:40:57

相关问题