linux - 使用 cmake 构建项目时出现 OpenCV 3.2.0 链接器错误

标签 linux opencv ubuntu cmake linker-errors

我错误地删除了/usr/local 文件夹,之后我不得不再次构建 OpenCV 和 Caffe。现在我的项目没有编译。每次我尝试使用 cmake 构建项目时,都会出现停止进度的错误。

[ 80%] Built target mygoturn
[ 80%] Linking CXX executable ../bin/runTracker
/usr/bin/ld: CMakeFiles/runTracker.dir/src/visualizer/runTracker.cpp.o: undefined reference to symbol '_ZN2cv6imreadERKNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEEi'
//usr/local/lib/libopencv_imgcodecs.so.4.1: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
CMakeFiles/runTracker.dir/build.make:200: recipe for target '../bin/runTracker' failed
make[2]: *** [../bin/runTracker] Error 1
CMakeFiles/Makefile2:104: recipe for target 'CMakeFiles/runTracker.dir/all' failed
make[1]: *** [CMakeFiles/runTracker.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

我用命令 pkg-config --libs --cflags opencv 检查过 并得到以下回复:

-I/usr/include/opencv -lopencv_shape -lopencv_stitching -lopencv_superres -lopencv_videostab -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_datasets -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hdf -lopencv_line_descriptor -lopencv_optflow -lopencv_video -lopencv_plot -lopencv_reg -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_rgbd -lopencv_viz -lopencv_surface_matching -lopencv_text -lopencv_ximgproc -lopencv_calib3d -lopencv_features2d -lopencv_flann -lopencv_xobjdetect -lopencv_objdetect -lopencv_ml -lopencv_xphoto -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_photo -lopencv_imgproc -lopencv_core

然后我包括了包含构建序列的 CMakeLists.txt 文件。

cmake_minimum_required(VERSION 3.6)
project(mygoturn)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
find_package(Boost COMPONENTS system filesystem regex REQUIRED)

# avoid "can not find -lopencv_dep_cudart"
set(CUDA_USE_STATIC_CUDA_RUNTIME OFF)

find_package( OpenCV REQUIRED )
message("Open CV version is ${OpenCV_VERSION}")

set(Caffe_DIR ~/tracking/GOTURN/caffe)
find_package(Caffe REQUIRED)
include_directories(${Caffe_INCLUDE_DIRS})
add_definitions(${Caffe_DEFINITIONS})    # ex. -DCPU_ONLY
message("Caffe_DIR is ${Caffe_DIR}")

set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/bin")

add_library (${PROJECT_NAME}

        src/network/regressor.cpp
        src/network/regressor_base.cpp
        src/tracker/tracker.cpp
        src/helper/helper.cpp
        src/helper/bounding_box.cpp
        src/helper/image_proc.cpp

        src/network/regressor.h
        src/network/regressor_base.h
        src/tracker/tracker.h
        src/helper/helper.h
        src/helper/bounding_box.h
        src/helper/image_proc.h
       )

include_directories(src)

set(SOURCE_FILES src/visualizer/runTracker.cpp src/loader/loader_base.cpp src/loader/loader_base.h)
add_executable(runTracker ${SOURCE_FILES})
target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS} ${Caffe_LIBRARIES} ${Boost_LIBRARIES})
target_link_libraries (runTracker ${PROJECT_NAME})

最佳答案

在构建新版本的OpenCV库(opencv4)后,我发现highgui模块的实现几乎没有变化,其中highgui模块上的实现很少转移到imgcodecs(主要是imread和 imwrite)。

更具体地设置 CMAKE_CXX_FLAGS 以包括所有库或具体地设置 -lopencv_imgcodecs 就足够了。

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -lopencv_imgcodecs")

这恰好解决了我一直面临的问题。 pkg-config --libs opencv 列出了在 opencv4 中构建的所有库模块。

关于linux - 使用 cmake 构建项目时出现 OpenCV 3.2.0 链接器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55666145/

相关文章:

python - 如何设置 'lock the keyboard' 以防止在 X11/Linux/Gnome 上发送更多按键?

linux - RPM 包中 SPEC 文件中 1%{?dist} 的含义是什么

android - 人脸识别使用Opencv4Android SDK教程?

java - Linux - "Too many open files"带管道,如何调试

linux - 网络上所有机器的主机名发现

OpenCV 2.4.3 - warpPerspective 在裁剪图像上具有反向单应性

javascript - 使用 opencv.js 获取轮廓点

linux - 添加从 RPM 移植的 pkg 后,JFrog Artifactory 和 MergeList/var/lib/apt/lists "(NewVersion2)"问题

azure - 授予对新主机的访问权限?

linux - 在 Bash 中计算平均值