我想在Linux上运行使用CMake构建一个基于OpenCV的项目。到目前为止,我CMakeLists.txt
文件看起来像我如何告诉cmake我希望我的项目静态链接库?
FIND_PACKAGE (OpenCV REQUIRED)
...
TARGET_LINK_LIBRARIES (my-executable ${OpenCV_LIBS})
但这会导致动态链接库。我如何链接静态库?
我想在Linux上运行使用CMake构建一个基于OpenCV的项目。到目前为止,我CMakeLists.txt
文件看起来像我如何告诉cmake我希望我的项目静态链接库?
FIND_PACKAGE (OpenCV REQUIRED)
...
TARGET_LINK_LIBRARIES (my-executable ${OpenCV_LIBS})
但这会导致动态链接库。我如何链接静态库?
通过在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'。 :-) – Ela782 2015-12-31 21:36:36
我将BUILD_SHARED_LIBRARIES更正为BUILD_SHARED_LIBS。 – 2016-09-10 18:28:34
至少在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
要链接一切静态,我相信你正在寻找CMAKE_EXE_LINKER_FLAGS
(添加-static
)。
您是否使用OpenCVConfig.cmake的'简单方法'?或较旧的FindOpenCV.cmake?
在add_library行指定静态。见http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:add_library
修正,因为你正在寻找对静态库我会考虑的 CMAKE_FIND_LIBRARY_SUFFIXES财产
我认为add_library命令是要生成一个输出二进制文件。在这种情况下,指定STATIC将导致它生成.a。 – jkerian 2010-09-20 22:52:39
add_library的static关键字指定它生成的库的类型,它不是在生成二进制文件时使用的。 – RobertJMaynard 2010-09-20 23:11:56
也许我误解了,但我认为OP是试图链接一个静态库,而不是生成一个。 – jkerian 2010-09-20 23:36:41
据我所知,这是一个有点棘手,因为CMake的,更准确的find_library命令,宁愿共享库,并发现这些链接如果共享和静态都可用。
我仍然在寻找一个很好的解决方案,以便能够“尽可能静态地”编译二进制文件,但是我还没有找到优雅的解决方案。它肯定会工作的唯一方法是通过自定义的FindXXXX模块来实现一切。
现在,我唯一的方法是更改搜索库后缀: '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
注意GCC拒绝,如果你通过-static选项链接,但你必须在链接参数动态库 - 你会如果你只是简单地使用FindOpenCV.cmake这拿起动态库(我不知道OpenCVConfig.cmake的行为如何)...
其实这个问题似乎已经在OpenCV附带的OpenCVConfig.cmake
中得到修复。您所要做的就是在您的CMakeLists.txt
中定义OpenCV_STATIC
。即
set(OpenCV_STATIC ON)
find_package(OpenCV REQUIRED)
'find_package(OpenCV REQUIRED)'是做什么的? – James 2015-07-14 00:40:57
您如何指出“静态OpenCV构建CMake”?我的版本有静态和共享库。 – 2012-05-17 19:53:53
请参阅下面的答案:http://stackoverflow.com/a/10709424/6069 – agnul 2012-05-22 20:12:03