在Linux(64位)上使用cmake 2.8.12.1将静态Qt 5.2.0构建为OpenCV 2.4.8作为静态库

时间:2014-01-10 08:30:54

标签: c++ linux qt opencv cmake

[编辑]我现在已经能够取得进步并使用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()

0 个答案:

没有答案