在虚拟机上使用 OpenCV 重建 C++ 程序

tot*_*tok 2 c++ linux opencv compilation cmake

我需要从 ubuntu 20.04 切换到 Windows 7 工作站。

我正在为Raspberry PI编写一个需要pthread的程序,因此我需要一个linux测试环境。

我安装了 ubuntu 20.04 VM 并重新安装了程序中使用的所有库:

  • OpenCV 4.2
  • 利托奇
  • Cpp数

这是我的 CMakeLists.txt :

cmake_minimum_required(VERSION 3.15)
project(POC_V4)

set(CMAKE_CXX_STANDARD 14)

# Specifying we are using pthread for UNIX systems.
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS} -pthread -Wall")

find_package(OpenCV REQUIRED)
find_package(Torch REQUIRED)

if(NOT Torch_FOUND)
    message(FATAL_ERROR "Pytorch Not Found!")
endif(NOT Torch_FOUND)

message(STATUS "Pytorch status :")
message(STATUS "    libraries: ${TORCH_LIBRARIES}")

message(STATUS "OpenCV library status :")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")

add_executable(POC_V4 <all_my_sources_and_headers>)
target_link_libraries(POC_V4 ${TORCH_LIBRARIES} ${OpenCV_LIBS})
target_link_libraries(POC_V4 pthread dl util)
Run Code Online (Sandbox Code Playgroud)

在真实的 PC 和 VM 上,cmake 输出是相同的:

cmake_minimum_required(VERSION 3.15)
project(POC_V4)

set(CMAKE_CXX_STANDARD 14)

# Specifying we are using pthread for UNIX systems.
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${TORCH_CXX_FLAGS} -pthread -Wall")

find_package(OpenCV REQUIRED)
find_package(Torch REQUIRED)

if(NOT Torch_FOUND)
    message(FATAL_ERROR "Pytorch Not Found!")
endif(NOT Torch_FOUND)

message(STATUS "Pytorch status :")
message(STATUS "    libraries: ${TORCH_LIBRARIES}")

message(STATUS "OpenCV library status :")
message(STATUS "    version: ${OpenCV_VERSION}")
message(STATUS "    libraries: ${OpenCV_LIBS}")
message(STATUS "    include path: ${OpenCV_INCLUDE_DIRS}")

add_executable(POC_V4 <all_my_sources_and_headers>)
target_link_libraries(POC_V4 ${TORCH_LIBRARIES} ${OpenCV_LIBS})
target_link_libraries(POC_V4 pthread dl util)
Run Code Online (Sandbox Code Playgroud)

在我真正的 Ubuntu PC 上,构建工作正常,但在虚拟机上链接期间失败:

-- Pytorch status :
--     libraries: torch;torch_library;/usr/lib/libc10.so
-- OpenCV library status :
--     version: 4.2.0
--     libraries: opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_stitching;opencv_video;opencv_videoio;opencv_aruco;opencv_bgsegm;opencv_bioinspired;opencv_ccalib;opencv_datasets;opencv_dnn_objdetect;opencv_dnn_superres;opencv_dpm;opencv_face;opencv_freetype;opencv_fuzzy;opencv_hdf;opencv_hfs;opencv_img_hash;opencv_line_descriptor;opencv_optflow;opencv_phase_unwrapping;opencv_plot;opencv_quality;opencv_reg;opencv_rgbd;opencv_saliency;opencv_shape;opencv_stereo;opencv_structured_light;opencv_superres;opencv_surface_matching;opencv_text;opencv_tracking;opencv_videostab;opencv_viz;opencv_ximgproc;opencv_xobjdetect;opencv_xphoto
--     include path: /usr/include/opencv4
-- Configuring done
-- Generating done
-- Build files have been written to: <path_where_i_build>```
Run Code Online (Sandbox Code Playgroud)

总而言之:

  • 相同的操作系统
  • 相同的库版本(OpenCV 4.2)
  • 相同的 CMakeLists.txt 文件

OpenCV 的链接问题...

有任何想法吗 ?

tot*_*tok 5

我终于成功地让它工作了,感谢 @squareskittles :我需要卸载 OpenCV,并使用 C++14 标准将其从源代码重建为良好版本。

如果您在构建时遇到与 OpenCV 相关的链接问题,请卸载 OpenCV 并自行构建:

sudo apt remove libopencv-dev && sudo apt autoremove

cd ~/Downloads
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
cd opencv_contrib
git checkout 4.2.0
cd ../opencv
git checkout 4.2.0
mkdir build
Run Code Online (Sandbox Code Playgroud)

打开CMakeLists.txt并在文件开头添加以下行:

add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
Run Code Online (Sandbox Code Playgroud)

然后构建 OpenCV :

add_definitions(-D_GLIBCXX_USE_CXX11_ABI=0)
Run Code Online (Sandbox Code Playgroud)

安装可能缺少的图形输出处理库。

cd build
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local OPENCV_EXTRA_MODULES_PATH=~/Downloads/opencv_contrib/modules/ ..
make
sudo make install
sudo ldconfig
Run Code Online (Sandbox Code Playgroud)

尝试重新构建项目,这应该可行!

再次感谢@squareskittles!