首页 文章

CMake链接opencv两次搞乱编译器命令顺序

提问于
浏览
0

环境: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之后,一次出现在后面),则无效 .

题:

  • 为什么opencv被链接两次?

  • 我应该如何克服这个问题,以便 -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

the compiler commands 是:/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?

1 回答

  • 0

    似乎CMake没有发送文件 FindOpenCV.cmake ,因此您使用3d party one配置OpenCV库 .

    为什么opencv被链接两次?

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

    我应该如何克服这个问题,以便-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
    

相关问题