[编辑]我现在已经能够取得进步并使用OpenCV构建我的项目,并且所有依赖项都是静态链接的。我试图尽可能地回答我的问题(下面),但仍然存在问题。
为了能够将OpenCV链接到我正在开发的库(X-Plane fligt sim的插件),我使用cmake的-DBUILD_SHARED_LIBS=OFF
标志将其构建为静态库。
我还需要Qt GUI后端,起初我刚刚在我的系统上安装了Qt共享库。 OpenCV构建确实识别了这些,但显然它们没有静态地链接到OpenCV,因为我在连接到我构建的OpenCV库之后在我的应用程序中获得了未定义的符号。 为什么应用不使用共享的Qt库?
我假设当我静态链接一个对象时,它只会尝试静态地找到它的依赖项,它不会尝试去系统上的共享库。我仍然希望澄清这一点。
所以,我认为我需要有静态Qt库并将OpenCV构建指向它们。 您能否确认这是正确的想法或可能解释原因?
我能够将共享库( .so)链接到我的应用程序中,所以答案是否定的,当我想将它们链接到我的应用程序时,我不必使用静态库。此外,OpenCV不会链接Qt,因此当您需要在应用程序中使用OpenCV Qt支持时,您需要自己链接Qt。
我被咬过的一件重要事情是,当链接库必须按照它们的依赖关系顺序呈现给GCC链接器时 - 总是在对象本身之后列出对象的依赖关系。*
所以我将Qt 5.2.0构建为静态库,安装在我的系统上,并使用环境变量指向OpenCV构建:CMAKE_PREFIX_PATH=/usr/local/Qt-5.2.0
这至少部分起作用,因为我可以看到cmake使用的新位置,但我开始收到以下cmake错误:
CMake Error at cmake/OpenCVUtils.cmake:344 (foreach):
Syntax error in cmake code at
/home/martin/Work/Hack/libs/opencv-2.4.8/cmake/OpenCVUtils.cmake:344
when parsing string
${Qt5::Core_LIB_DEPENDS}
syntax error, unexpected cal_SYMBOL, expecting } (24)
Call Stack (most recent call first):
cmake/OpenCVModule.cmake:843 (ocv_split_libs_list)
cmake/OpenCVModule.cmake:886 (__ocv_track_module_link_dependencies)
CMakeLists.txt:544 (ocv_track_build_dependencies)
您知道造成此错误的原因吗?
我放弃了尝试针对静态Qt5构建OpenCV,所以这已经不再适用了,我还没有找到答案。如果osmeone知道这个问题是什么,那么对其他人来说仍然可以使用。
以下是OpenCVModule.cmake文件的相关部分。
get_target_property(__module_type ${the_module} TYPE)
if(__module_type STREQUAL "STATIC_LIBRARY")
#in case of static library we have to inherit its dependencies (in right order!!!)
if(NOT DEFINED ${the_module}_LIB_DEPENDS_${optkind})
vvvvvvvvvv issue on the line below vvvvvvvvvvvvvvvvvv
ocv_split_libs_list(${the_module}_LIB_DEPENDS ${the_module}_LIB_DEPENDS_DBG ${the_module}_LIB_DEPENDS_OPT)
endif()
set(__resolved_deps "")
set(__mod_depends ${${the_module}_LIB_DEPENDS_${optkind}})
set(__has_cycle FALSE)
while(__mod_depends)
list(GET __mod_depends 0 __dep)
list(REMOVE_AT __mod_depends 0)
if(__dep STREQUAL the_module)
set(__has_cycle TRUE)
else()#if("${OPENCV_MODULES_BUILD}" MATCHES "(^|;)${__dep}(;|$)")
ocv_regex_escape(__rdep "${__dep}")
if(__resolved_deps MATCHES "(^|;)${__rdep}(;|$)")
#all dependencies of this module are already resolved
list(APPEND ${the_module}_MODULE_DEPS_${optkind} "${__dep}")
else()
get_target_property(__module_type ${__dep} TYPE)
if(__module_type STREQUAL "STATIC_LIBRARY")
if(NOT DEFINED ${__dep}_LIB_DEPENDS_${optkind})
ocv_split_libs_list(${__dep}_LIB_DEPENDS ${__dep}_LIB_DEPENDS_DBG ${__dep}_LIB_DEPENDS_OPT)
endif()
list(INSERT __mod_depends 0 ${${__dep}_LIB_DEPENDS_${optkind}} ${__dep})
list(APPEND __resolved_deps "${__dep}")
elseif(NOT __module_type)
list(APPEND ${the_module}_EXTRA_DEPS_${optkind} "${__dep}")
endif()
endif()
#else()
# get_target_property(__dep_location "${__dep}" LOCATION)
endif()
endwhile()