【问题标题】:Linking problem with OpenCV and CMakeOpenCV 和 CMake 的链接问题
【发布时间】:2011-09-14 13:37:32
【问题描述】:

我正在编写一个使用 OpenCV 的程序(安装在本地目录中,因为我在该机器上没有 root 权限),并且我已经编写了相应的 CMakeLists.txt 文件。我的问题是编译在链接阶段以不同的方式失败(我花了三个小时尝试了网络上提出的所有不同解决方案,所以我看到了很多结果)。 这是对我来说更有意义的配置/结果,即使它们导致失败: [在 project_root/CMakeLists.txt]:

cmake_minimum_required(VERSION 2.8)
project(CUDA_learning)

set(OpenCV_INCLUDE_DIR "path/to/opencv_CUDA/include")
include_directories(${OpenCV_INCLUDE_DIR})
set(OpenCV_LIBS_DIR "path/to/opencv_CUDA/lib")
link_directories(${OpenCV_LIBS_DIR})
set(OpenCV_LIBS "opencv_core opencv_imgproc opencv_calib3d opencv_video opencv_features2d opencv_ml opencv_highgui opencv_objdetect opencv_contrib opencv_legacy opencv_gpu")

find_package(Boost COMPONENTS system filesystem program_options regex REQUIRED)
if(Boost_FOUND)
  include_directories(${Boost_INCLUDE_DIR})
else(Boost_FOUND)
  message(FATAL_ERROR "Cannot build application without Boost. Please set Boost_INCLUDE_DIR.")
endif(Boost_FOUND)

set(CMAKE_BUILD_TYPE debug)

add_definitions("-Wall")

set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/../bin)

subdirs (
  ../src
)

[在 project_root/src/CMakeLists.txt]:

FILE(GLOB dir_source *.cc 2D/*.cc)
FILE(GLOB dir_header *.hh 2D/*.hh)

add_executable(${PROJECT_NAME} ${dir_source} ${dir_header})
target_link_libraries(${PROJECT_NAME} ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY} ${OpenCV_LIBS})

结果:

Linking CXX executable ../../bin/CUDA_learning
c++: opencv_imgproc: No such file or directory
c++: opencv_calib3d: No such file or directory
c++: opencv_video: No such file or directory
c++: opencv_features2d: No such file or directory
c++: opencv_ml: No such file or directory
c++: opencv_highgui: No such file or directory
c++: opencv_objdetect: No such file or directory
c++: opencv_contrib: No such file or directory
c++: opencv_legacy: No such file or directory
c++: opencv_gpu: No such file or directory

如果与网上给出的建议相反,我在得到的 OpenCV 库名称前加了一个“-l”:

Linking CXX executable ../../bin/CUDA_learning
/usr/bin/ld: cannot find -lopencv_core
collect2: ld returned 1 exit status
make[2]: *** [../bin/CUDA_learning] Error 1
make[1]: *** [src/CMakeFiles/CUDA_learning.dir/all] Error 2
make: *** [all] Error 2

有谁知道如何解决这个问题?我真的为此发疯了...... 提前非常感谢! 干杯, 抢

【问题讨论】:

    标签: opencv cmake


    【解决方案1】:

    以下是将 OpenCV 包含到项目中的正确方法:

    set(OpenCV_DIR "path/to/opencv_CUDA/share/OpenCV"
       CACHE PATH "The path where OpenCVConfig.cmake is placed")
    find_package(OpenCV REQUIRED)
    
    # and for each executable/library dependent on OpenCV
    TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${OpenCV_LIBS} )
    

    【讨论】:

    • 它也不起作用... :( 系统管理员将在一周内更新我正在使用的服务器,我希望事情会有所改善。无论如何,非常感谢!
    • 从您的 cmets 我看到您使用的是旧版本的 OpenCV 主干。我建议您使用官方版本之一或升级到最新版本。自 2.2.9 以来修复了 200 多个错误(包括几个安装错误)。
    • 我知道,但感谢您指出这一点。我使用的是旧的 OpenCV 版本,因为我在服务器上没有 root 访问权限,并且在等待管理员安装 CUDA4.0 时,我想测试一些代码......
    【解决方案2】:

    这一行:

    set(OpenCV_LIBS "opencv_core opencv_imgproc opencv_calib3d opencv_video opencv_features2d opencv_ml opencv_highgui opencv_objdetect opencv_contrib opencv_legacy opencv_gpu")
    

    ...说你在 OpenCV_LIBS 变量中有一个库,它的名字很大,里面有很多空格。如果你去掉双引号,像这样:

    set(OpenCV_LIBS opencv_core opencv_imgproc opencv_calib3d opencv_video opencv_features2d opencv_ml opencv_highgui opencv_objdetect opencv_contrib opencv_legacy opencv_gpu)
    

    ...那么它将是一个库名称列表,它应该可以正常工作。

    CMake 使用空格字符来分隔其命令的参数。因此,要在 set 命令的值中包含空格,您必须将其双引号。在这种情况下,您不想这样做,因为您希望 set 命令看到您传入的多个值,而不是包含空格的一个大值。

    编辑:(更多信息基于 cmets 中的讨论):

    如果这仍然不起作用,请仔细检查您使用的名称是否正确。使用您在此处使用的库名称,在 OpenCV_LIBS_DIR 变量命名的目录中应该有名为 libopencv_core.so、libopencv_imgproc.so 等的文件。如果这些确切的库名称不作为文件存在,则说明链接器错误。 (在这种情况下,正如 cmets 中所讨论的,实际文件在文件名中使用版本号命名,并且没有指向它们的“非版本化”符号链接。)

    【讨论】:

    • 您好,感谢您的回答,我已经尝试过,但仍然出现“找不到 -lopencv_core”错误...
    • 嗯...如果您将“subdirs”更改为“add_subdirectory”会怎样?
    • 我已将其更改为 add_subdirectory ( ${CMAKE_BINARY_DIR}/../src ) 但结果仍然没有变化:(
    • 我会使用“add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/src)”,因为这是一个完整的路径名,其中没有任何“..”相对引用。我还会仔细检查 OpenCV_LIBS_DIR 的值,并确保它也是对这些库所在目录的完整路径非相对引用。然后验证这些文件中的每一个是否都存在于该目录中。
    • 完成,仍然没有改善。 OpenCV_LIBS_DIR 中指定的目录列表为我提供了列表:libopencv_calib3d.so.2.2.9 libopencv_features2d.so.2.2.9 libopencv_highgui.so.2.2.9 libopencv_ml.so.2.2.9 libopencv_video.so.2.2.9 libopencv_contrib。 so.2.2.9 libopencv_flann.so.2.2.9 libopencv_imgproc.so.2.2.9 libopencv_objdetect.so.2.2.9 pkgconfig libopencv_core.so.2.2.9 libopencv_gpu.so.2.2.9 libopencv_legacy.so.2.2.9 libopencv_ts。 so.2.2.9 python2.6
    【解决方案3】:

    问题可能是链接器正在寻找一个名为 libopencv_core.so 的文件,但有一个名称相似的文件 libopencv_core.so.1 在这种情况下您需要使用符号链接。例如这样做ln -sf /opt/lib/libopencv_core.so.1 /opt/lib/libopencv_core.so

    【讨论】:

      猜你喜欢
      • 2010-12-20
      • 2015-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      相关资源
      最近更新 更多