-1

I have compiled OpenCV 4.5.4 from source with CUDA, and installed to /usr/local. I have a C++ project with CMakeLists.txt files to compile the project. I'm compiling it with OpenCV, LibTorch and Torchvision libraries, as shown below.

cmake_minimum_required(VERSION 3.12.0 FATAL_ERROR)

set(CMAKE_C_COMPILER /usr/bin/gcc)
set(CMAKE_CXX_COMPILER /usr/bin/g++)
set(CMAKE_CUDA_COMPILER /usr/local/cuda/bin/nvcc)

set(Torch_DIR /usr/local/lib/python3.8/dist-packages/torch/share/cmake/Torch/)
set(TorchVision_DIR /usr/local/share/cmake/TorchVision/)
find_package(Torch 1.13 REQUIRED)
find_package(OpenCV 4.5.4 REQUIRED)

file(GLOB_RECURSE OBJ_SRC_FILES src/*.cpp)
# file(GLOB_RECURSE OD_HDR_FILES inc/*.hpp)

add_library(ObjectDetector STATIC ${OBJ_SRC_FILES})
target_include_directories(ObjectDetector PUBLIC inc)
target_link_libraries(ObjectDetector PUBLIC ${OpenCV_LIBS} ${TORCH_LIBRARIES} TorchVision::TorchVision)

add_executable(cnnTest exec/cnnTest.cpp)
target_link_libraries(cnnTest PUBLIC ObjectDetector )
set_target_properties(cnnTest PROPERTIES CXX_STANDARD 14)

The core target ObjectDetector builds fine, but the executable cnnTest fails in the linking stage, with an error:

/usr/bin/ld: saturn/objectDetector/CMakeFiles/cnnTest.dir/exec/cnnTest.cpp.o: in function `main':
/home/dozer/git/project-saturn/saturn/objectDetector/exec/cnnTest.cpp:18: undefined reference to `cv::imread(std::string const&, int)'
/usr/bin/ld: /home/dozer/git/project-saturn/saturn/objectDetector/exec/cnnTest.cpp:37: undefined reference to `cv::imwrite(std::string const&, cv::_InputArray const&, std::vector<int, std::allocator<int> > const&)'
collect2: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.

The full error lists the linked libraries too, which includes

/usr/local/lib/libopencv_imgcodecs.so.4.5.4

that contains the imread and imwrite functions.

The full error is here:

FAILED: saturn/objectDetector/cnnTest : && /usr/bin/g++ -g  saturn/objectDetector/CMakeFiles/cnnTest.dir/exec/cnnTest.cpp.o -o saturn/objectDetector/cnnTest -L/usr/local/cuda/lib64   -L/usr/local/lib -Wl,-rpath,/usr/local/cuda/lib64:/usr/local/lib:/usr/local/lib/python3.8/dist-packages/torch/lib  saturn/objectDetector/libObjectDetector.a  /usr/local/lib/libopencv_gapi.so.4.5.4  /usr/local/lib/libopencv_stitching.so.4.5.4  /usr/local/lib/libopencv_alphamat.so.4.5.4  /usr/local/lib/libopencv_aruco.so.4.5.4  /usr/local/lib/libopencv_barcode.so.4.5.4  /usr/local/lib/libopencv_bgsegm.so.4.5.4  /usr/local/lib/libopencv_bioinspired.so.4.5.4  /usr/local/lib/libopencv_ccalib.so.4.5.4  /usr/local/lib/libopencv_cudabgsegm.so.4.5.4  /usr/local/lib/libopencv_cudafeatures2d.so.4.5.4  /usr/local/lib/libopencv_cudaobjdetect.so.4.5.4  /usr/local/lib/libopencv_cudastereo.so.4.5.4  /usr/local/lib/libopencv_dnn_objdetect.so.4.5.4  /usr/local/lib/libopencv_dnn_superres.so.4.5.4  /usr/local/lib/libopencv_dpm.so.4.5.4  /usr/local/lib/libopencv_face.so.4.5.4  /usr/local/lib/libopencv_freetype.so.4.5.4  /usr/local/lib/libopencv_fuzzy.so.4.5.4  /usr/local/lib/libopencv_hfs.so.4.5.4  /usr/local/lib/libopencv_img_hash.so.4.5.4  /usr/local/lib/libopencv_intensity_transform.so.4.5.4  /usr/local/lib/libopencv_line_descriptor.so.4.5.4  /usr/local/lib/libopencv_mcc.so.4.5.4  /usr/local/lib/libopencv_quality.so.4.5.4  /usr/local/lib/libopencv_rapid.so.4.5.4  /usr/local/lib/libopencv_reg.so.4.5.4  /usr/local/lib/libopencv_rgbd.so.4.5.4  /usr/local/lib/libopencv_saliency.so.4.5.4  /usr/local/lib/libopencv_stereo.so.4.5.4  /usr/local/lib/libopencv_structured_light.so.4.5.4  /usr/local/lib/libopencv_phase_unwrapping.so.4.5.4  /usr/local/lib/libopencv_superres.so.4.5.4  /usr/local/lib/libopencv_cudacodec.so.4.5.4  /usr/local/lib/libopencv_surface_matching.so.4.5.4  /usr/local/lib/libopencv_tracking.so.4.5.4  /usr/local/lib/libopencv_highgui.so.4.5.4  /usr/local/lib/libopencv_datasets.so.4.5.4  /usr/local/lib/libopencv_plot.so.4.5.4  /usr/local/lib/libopencv_text.so.4.5.4  /usr/local/lib/libopencv_videostab.so.4.5.4  /usr/local/lib/libopencv_cudaoptflow.so.4.5.4  /usr/local/lib/libopencv_cudalegacy.so.4.5.4  /usr/local/lib/libopencv_cudawarping.so.4.5.4  /usr/local/lib/libopencv_optflow.so.4.5.4  /usr/local/lib/libopencv_wechat_qrcode.so.4.5.4  /usr/local/lib/libopencv_xfeatures2d.so.4.5.4  /usr/local/lib/libopencv_ml.so.4.5.4  /usr/local/lib/libopencv_shape.so.4.5.4  /usr/local/lib/libopencv_ximgproc.so.4.5.4  /usr/local/lib/libopencv_video.so.4.5.4  /usr/local/lib/libopencv_xobjdetect.so.4.5.4  /usr/local/lib/libopencv_objdetect.so.4.5.4  /usr/local/lib/libopencv_calib3d.so.4.5.4  /usr/local/lib/libopencv_dnn.so.4.5.4  /usr/local/lib/libopencv_features2d.so.4.5.4  /usr/local/lib/libopencv_flann.so.4.5.4  /usr/local/lib/libopencv_xphoto.so.4.5.4  /usr/local/lib/libopencv_photo.so.4.5.4  /usr/local/lib/libopencv_cudaimgproc.so.4.5.4  /usr/local/lib/libopencv_cudafilters.so.4.5.4  /usr/local/lib/libopencv_cudaarithm.so.4.5.4  -Wl,--no-as-needed,"/usr/local/lib/python3.8/dist-packages/torch/lib/libtorch.so" -Wl,--as-needed  /usr/local/lib/python3.8/dist-packages/torch/lib/libc10.so  /usr/local/cuda/lib64/stubs/libcuda.so  /usr/local/cuda/lib64/libnvrtc.so  /usr/local/lib/python3.8/dist-packages/torch/lib/libc10_cuda.so  /usr/local/lib/libtorchvision.so  /usr/local/lib/python3.8/dist-packages/torch/lib/libtorch.so  -Wl,--no-as-needed,"/usr/local/lib/python3.8/dist-packages/torch/lib/libtorch_cuda.so" -Wl,--as-needed  -Wl,--no-as-needed,"/usr/local/lib/python3.8/dist-packages/torch/lib/libtorch_cuda_cpp.so" -Wl,--as-needed  -Wl,--no-as-needed,"/usr/local/lib/python3.8/dist-packages/torch/lib/libtorch_cpu.so" -Wl,--as-needed  /usr/local/lib/python3.8/dist-packages/torch/lib/libc10_cuda.so  /usr/local/lib/python3.8/dist-packages/torch/lib/libc10.so  /usr/local/cuda/lib64/libnvToolsExt.so  /usr/local/cuda/lib64/libcufft.so  /usr/local/cuda/lib64/libcurand.so  /usr/local/cuda/lib64/libcublas.so  /usr/local/cuda/lib64/libcudnn.so  -Wl,--no-as-needed,"/usr/local/lib/python3.8/dist-packages/torch/lib/libtorch_cuda_cu.so" -Wl,--as-needed  /usr/lib/x86_64-linux-gnu/libpng.so  /usr/lib/x86_64-linux-gnu/libjpeg.so  /usr/local/lib/libCCTag.so.1.0.2  /usr/local/lib/libopencv_videoio.so.4.5.4  /usr/local/lib/libopencv_imgcodecs.so.4.5.4  /usr/local/lib/libopencv_imgproc.so.4.5.4  /usr/local/lib/libopencv_core.so.4.5.4  /usr/local/lib/libopencv_cudev.so.4.5.4  /usr/local/cuda/lib64/libcudart.so  /usr/lib/x86_64-linux-gnu/libboost_date_time.so.1.71.0  /usr/lib/x86_64-linux-gnu/libboost_thread.so.1.71.0  -lpthread  /usr/lib/x86_64-linux-gnu/libboost_serialization.so.1.71.0  /usr/lib/x86_64-linux-gnu/libboost_system.so.1.71.0  /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.71.0  /usr/lib/x86_64-linux-gnu/libboost_atomic.so.1.71.0  /usr/lib/x86_64-linux-gnu/libboost_program_options.so.1.71.0  /usr/lib/x86_64-linux-gnu/libboost_timer.so.1.71.0  /usr/lib/x86_64-linux-gnu/libboost_chrono.so.1.71.0  /usr/lib/x86_64-linux-gnu/libboost_math_c99.so.1.71.0  /usr/local/cuda/lib64/libcudadevrt.a  /usr/lib/x86_64-linux-gnu/libtbb.so  /usr/lib/x86_64-linux-gnu/libtbbmalloc.so  /usr/local/cuda/lib64/libcudadevrt.a  /usr/lib/x86_64-linux-gnu/libtbb.so  /usr/lib/x86_64-linux-gnu/libtbbmalloc.so  -lpthread  -ldl && :

: && /usr/bin/g++ -g  saturn/objectDetector/CMakeFiles/cnnTest.dir/exec/cnnTest.cpp.o -o saturn/objectDetector/cnnTest -L/usr/local/cuda/lib64   -L/usr/local/lib -Wl,-rpath,/usr/local/cuda/lib64:/usr/local/lib:/usr/local/lib/python3.8/dist-packages/torch/lib  saturn/objectDetector/libObjectDetector.a  /usr/local/lib/libopencv_gapi.so.4.5.4  /usr/local/lib/libopencv_stitching.so.4.5.4  /usr/local/lib/libopencv_alphamat.so.4.5.4  /usr/local/lib/libopencv_aruco.so.4.5.4  /usr/local/lib/libopencv_barcode.so.4.5.4  /usr/local/lib/libopencv_bgsegm.so.4.5.4  /usr/local/lib/libopencv_bioinspired.so.4.5.4  /usr/local/lib/libopencv_ccalib.so.4.5.4  /usr/local/lib/libopencv_cudabgsegm.so.4.5.4  /usr/local/lib/libopencv_cudafeatures2d.so.4.5.4  /usr/local/lib/libopencv_cudaobjdetect.so.4.5.4  /usr/local/lib/libopencv_cudastereo.so.4.5.4  /usr/local/lib/libopencv_dnn_objdetect.so.4.5.4  /usr/local/lib/libopencv_dnn_superres.so.4.5.4  /usr/local/lib/libopencv_dpm.so.4.5.4  /usr/local/lib/libopencv_face.so.4.5.4  /usr/local/lib/libopencv_freetype.so.4.5.4  /usr/local/lib/libopencv_fuzzy.so.4.5.4  /usr/local/lib/libopencv_hfs.so.4.5.4  /usr/local/lib/libopencv_img_hash.so.4.5.4  /usr/local/lib/libopencv_intensity_transform.so.4.5.4  /usr/local/lib/libopencv_line_descriptor.so.4.5.4  /usr/local/lib/libopencv_mcc.so.4.5.4  /usr/local/lib/libopencv_quality.so.4.5.4  /usr/local/lib/libopencv_rapid.so.4.5.4  /usr/local/lib/libopencv_reg.so.4.5.4  /usr/local/lib/libopencv_rgbd.so.4.5.4  /usr/local/lib/libopencv_saliency.so.4.5.4  /usr/local/lib/libopencv_stereo.so.4.5.4  /usr/local/lib/libopencv_structured_light.so.4.5.4  /usr/local/lib/libopencv_phase_unwrapping.so.4.5.4  /usr/local/lib/libopencv_superres.so.4.5.4  /usr/local/lib/libopencv_cudacodec.so.4.5.4  /usr/local/lib/libopencv_surface_matching.so.4.5.4  /usr/local/lib/libopencv_tracking.so.4.5.4  /usr/local/lib/libopencv_highgui.so.4.5.4  /usr/local/lib/libopencv_datasets.so.4.5.4  /usr/local/lib/libopencv_plot.so.4.5.4  /usr/local/lib/libopencv_text.so.4.5.4  /usr/local/lib/libopencv_videostab.so.4.5.4  /usr/local/lib/libopencv_cudaoptflow.so.4.5.4  /usr/local/lib/libopencv_cudalegacy.so.4.5.4  /usr/local/lib/libopencv_cudawarping.so.4.5.4  /usr/local/lib/libopencv_optflow.so.4.5.4  /usr/local/lib/libopencv_wechat_qrcode.so.4.5.4  /usr/local/lib/libopencv_xfeatures2d.so.4.5.4  /usr/local/lib/libopencv_ml.so.4.5.4  /usr/local/lib/libopencv_shape.so.4.5.4  /usr/local/lib/libopencv_ximgproc.so.4.5.4  /usr/local/lib/libopencv_video.so.4.5.4  /usr/local/lib/libopencv_xobjdetect.so.4.5.4  /usr/localopencv_imgcodecsread  /usr/lib/x86_64-linux-gnu/libboost_serialization.so.1.71.0  /usr/lib/x86_64-linux-gnu/libboost_system.so.1.71.0  /usr/lib/x86_64-linux-gnu/libboost_filesystem.so.1.71.0  /usr/lib/x86_64-linux-gnu/libboost_atomic.so.1.71.0  /usr/lib/x86_64-linux-gnu/libboost_program_options.so.1.71.0  /usr/lib/x86_64-linux-gnu/libboost_timer.so.1.71.0  /usr/lib/x86_64-linux-gnu/libboost_chrono.so.1.71.0  /usr/lib/x86_64-linux-gnu/libboost_math_c99.so.1.71.0  /usr/local/cuda/lib64/libcudadevrt.a  /usr/lib/x86_64-linux-gnu/libtbb.so  /usr/lib/x86_64-linux-gnu/libtbbmalloc.so  /usr/local/cuda/lib64/libcudadevrt.a  /usr/lib/x86_64-linux-gnu/libtbb.so  /usr/lib/x86_64-linux-gnu/libtbbmalloc.so  -lpthread  -ldl && :

I'm out of ideas trying to force the compiler to link these libraries, I've looked at other answers that involve running sudo ldconfig, adding include directories etc but none work so far.

Notably, trying to link the libraries with a sample cpp file with a simple imread-imwrite example compiles fine by using pkg-config to link and include files in g++. Any ideas are appreciated!

EDIT: I found that in a simple sample program, just linking OpenCV compiles just fine, but linking the Torch libraries along with it reproduces this behaviour even if doesn't use any torch headers. I think it may be some namespace conflict. I installed Torch through pip and I'm using the TorchConfig.cmake that installs with the pip installation to link. (see set Torch_DIR line in my CMakeList file.)

Gman007
  • 1
  • 2
  • 1
    I can't check it and am not fit enough with CMake, but are ObjectDetector and cnnTest 2 different targets? Currently, opencv is only in target_link_libraries of ObjectDetector. Did you try adding it to target_link_libraries(cnnTest ...) as well? – Micka Jun 27 '23 at 05:58
  • @Micka: The target `cnnTest` links with OpenCV libraries **transitively**, via the `ObjectDetector` (note the line `target_link_libraries(cnnTest PUBLIC ObjectDetector )`). The code has no problems on that side. Also, the OP shows exact command line which is failed, and this command line definitly contains OpenCV libraries. – Tsyvarev Jun 27 '23 at 08:50
  • Is it possible that you have multiple opencv versions installed and the included imread isnt compatible to your linked version? – Micka Jun 27 '23 at 18:33
  • I'm building this within my docker container, and there should only be this version of OpenCV within it. I do specify the version required in the cmakelist.txt though so I'm not sure if it will still grab some alternate version if it existed. – Gman007 Jun 28 '23 at 16:43
  • "even when opencv library is linked to the executable correctly" - Ehh, Obviously you are not linking correctly when you get a linker error... – Jesper Juhl Jun 29 '23 at 01:35
  • @JesperJuhl my bad, updated the title accordingly. – Gman007 Jun 29 '23 at 03:22

1 Answers1

0

After finding that the issue was reproducible on a sample file with both OpenCV and PyTorch (LibTorch) linked to it (but not when just opencv was liked), I figured the issue was related to LibTorch. I found the answer to my question here:

Can't link a project using cmake with OpenCV and LibTorch

Using the precompiled cxx11 ABI libtorch library (not the pre-cxx11 ABI) instead of the one installed through pip allows me to build my project. Also I had to recompile TorchVision with the new LibTorch libraries.

For now this fixes the issue, but I'd still like to know if there is any way to use the pip installed torch libraries instead! Thanks.

Gman007
  • 1
  • 2
  • According to what you said, the pip version of libtorch should be a version before cxx11 ABI. Therefore, it will not work with the cxx11 ABI version of opencv. Am I right? – FreeToGo Aug 16 '23 at 15:30