【问题标题】:CMake link opencv twice mess up compiler command orderCMake链接opencv两次弄乱了编译器命令顺序
【发布时间】:2015-09-29 00:55:36
【问题描述】:

环境:gcc (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4

我用find_package( OpenCV REQUIRED )找到opencv库,用target_link_libraries(executable ${OpenCV_LIBS})链接opencv。

我打开SET(CMAKE_VERBOSE_MAKEFILE 1),这样我就可以看到编译器的命令是什么。

CMakeLists.txt:

cmake_minimum_required (VERSION 2.8.3)
project (video_capture)

find_package( OpenCV REQUIRED )

SET(CMAKE_VERBOSE_MAKEFILE 1)

add_executable( vidcapture main.cpp)

target_link_libraries(vidcapture ${OpenCV_LIBS})

从编译器输出 (link) 可以看出,opencv 库在-ldl -lm -lpthread -lrt -lGLU -lGL -lSM -lICE -lX11 -lXext -ltbb 之后链接了两次。 当需要将-lrt 放在编译器命令的末尾时,这似乎会产生问题,如下所述:link

如果我在编译器命令的末尾手动添加-lrt 则不起作用(即-lrt 出现两次,一次在opencv lib 之前,一次在之后)。

问题:

  1. 为什么opencv链接两次?

  2. 我应该如何解决这个问题,以便-lrt 只放在编译器命令的末尾一次?

更新:

MESSAGE("${OpenCV_LIBS}") 给我: opencv_videostab;opencv_video;opencv_ts;opencv_superres;opencv_stitching;opencv_photo;opencv_ocl;opencv_objdetect;opencv_nonfree;ope ncv_ml;opencv_legacy;opencv_imgproc;opencv_highgui;opencv_gpu;opencv_flann;opencv_features2d;opencv_core;opencv_contrib;opencv_calib 3d

编译器命令是:/usr/local/lib/libopencv_videostab.so.2.4.9 /usr/local/lib/libopencv_ts.a /usr/ local/lib/libopencv_superres.so.2.4.9 /usr/local/lib/libopencv_stitching.so.2.4.9 /usr/local/lib/libopencv_contrib.so.2.4.9 -ldl -lm -lpthread -lrt -lGLU - lGL -lSM -lICE -lX11 -lXext -ltbb /usr/local/lib/libopencv_nonfree.so.2.4.9 /usr/local/lib/libopencv_ocl.so.2.4.9 /usr/local/lib/libopencv_gpu.so。 2.4.9 /usr/local/lib/libopencv_photo.so.2.4.9 /usr/local/lib/libopencv_objdetect.so.2.4.9 /usr/local/lib/libopencv_legacy.so.2.4.9 /usr /local/lib/libopencv_video.so.2.4.9 /usr/local/lib/libopencv_ml.so.2.4.9 /usr/local/lib/libopencv_calib3d.so.2.4.9 /usr/local/lib /libopencv_features2d.so.2.4.9 /usr/local/lib/libopencv_highgui.so.2.4.9 /usr/local/lib/libopencv_imgproc.so.2.4.9 /usr/local/lib/libopencv_flann.so.2.4.9 /usr/local/lib/libopencv_core.so.2.4.9 -Wl,-rpath,/usr/local/lib

您可以看到 opencv_video 模块在${OpenCV_LIBS} 中的 opencv_ts 模块之前列出,而在编译器命令中它被放在之后。 我想知道这是否是一些 opencv 自依赖问题(例如 opencv_video 取决于应该首先链接的 opencv_videostab?

【问题讨论】:

    标签: c++ opencv cmake g++


    【解决方案1】:

    CMake 似乎没有发布文件FindOpenCV.cmake,所以你使用 3d 方一来配置 OpenCV 库。

    1. 为什么opencv链接了两次?

    FindOpenCV.cmake 的实现可能并不完全正确。

    1. 我应该如何解决这个问题,以便 -lrt 只放在编译器命令的末尾一次?

    在链接之前将OpenCV_LIBS修改为你想要的:

    list(REMOVE_DUPLICATES OpenCV_LIBS) # duplicates are not needed anywhere
    list(REMOVE_ITEM OpenCV_LIBS "-lrt") # remove "rt" library from the list..
    list(APPEND OpenCV_LIBS "-lrt") # ..and insert it to the end
    

    【讨论】:

    • 你能指定我应该把三个列表命令放在哪里吗?我把它放在不影响编译器命令的find_package( OpenCV REQUIRED ) 之后。非常感谢
    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多