I'm using Conan as my package manager. My CMakeLists.txt looks like this:
cmake_minimum_required(VERSION 3.20)
project(opencv-test)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS true)
include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup(NO_OUTPUT_DIRS)
add_executable(
${PROJECT_NAME}
main.cpp
)
target_include_directories(
${PROJECT_NAME}
PRIVATE
${PROJECT_SOURCE_DIR}
${CONAN_INCLUDE_DIRS_OPENCV}
)
target_link_libraries(
${PROJECT_NAME}
PRIVATE
${CONAN_LIBS_OPENCV}
)
When I try to build it, I get a lot of linking errors on both Windows and Linux. If I replace add_executable
with add_library
everything works fine. What am I doing wrong? How can I link OpenCV to the executable directly without using an additional library?
Build steps:
conan install . --install-folder Build
cmake -S . -B Build -DCMAKE_BUILD_TYPE=Debug
cmake --build Build
conanfile.txt:
[requires]
opencv/4.5.2
[generators]
cmake
Conan profile:
> conan profile show default
Configuration for profile default:
[settings]
os=Linux
os_build=Linux
arch=x86_64
arch_build=x86_64
compiler=gcc
compiler.version=9
compiler.libcxx=libstdc++11
build_type=Debug
[options]
[build_requires]
[env]
main.cpp:
#include <iostream>
#include "opencv2/imgcodecs.hpp"
int main()
{
cv::imread("test.png");
std::cout << "Hello, World!" << std::endl;
return 0;
}
Errors:
> cmake --build Build
Scanning dependencies of target OpenCVTest
[ 50%] Building CXX object CMakeFiles/OpenCVTest.dir/main.cpp.o
[100%] Linking CXX executable OpenCVTest
ld: error: undefined symbol: Imf_2_5::Chromaticities::Chromaticities(Imath_2_5::Vec2<float> const&, Imath_2_5::Vec2<float> const&, Imath_2_5::Vec2<float> const&, Imath_2_5::Vec2<float> const&)
>>> referenced by grfmt_exr.cpp:83 (/home/conan/w/BuildSingleReference/.conan/data/opencv/4.5.2/_/_/build/5d6fbfde15f1610a06b48504503efbd94beae363/source_subfolder/modules/imgcodecs/src/grfmt_exr.cpp:83)
>>> grfmt_exr.cpp.o:(cv::ExrDecoder::ExrDecoder()) in archive /home/work/.conan/data/opencv/4.5.2/_/_/package/5d6fbfde15f1610a06b48504503efbd94beae363/lib/libopencv_imgcodecs.a
ld: error: undefined symbol: Imf_2_5::globalThreadCount()
>>> referenced by grfmt_exr.cpp:125 (/home/conan/w/BuildSingleReference/.conan/data/opencv/4.5.2/_/_/build/5d6fbfde15f1610a06b48504503efbd94beae363/source_subfolder/modules/imgcodecs/src/grfmt_exr.cpp:125)
>>> grfmt_exr.cpp.o:(cv::ExrDecoder::readHeader()) in archive /home/work/.conan/data/opencv/4.5.2/_/_/package/5d6fbfde15f1610a06b48504503efbd94beae363/lib/libopencv_imgcodecs.a
>>> referenced by grfmt_exr.cpp:681 (/home/conan/w/BuildSingleReference/.conan/data/opencv/4.5.2/_/_/build/5d6fbfde15f1610a06b48504503efbd94beae363/source_subfolder/modules/imgcodecs/src/grfmt_exr.cpp:681)
>>> grfmt_exr.cpp.o:(cv::ExrEncoder::write(cv::Mat const&, std::vector<int, std::allocator<int> > const&)) in archive /home/work/.conan/data/opencv/4.5.2/_/_/package/5d6fbfde15f1610a06b48504503efbd94beae363/lib/libopencv_imgcodecs.a
...
This is what conanbuildinfo.cmake contains:
...
#################
### OPENCV
#################
set(CONAN_OPENCV_ROOT "/home/work/.conan/data/opencv/4.5.2/_/_/package/5d6fbfde15f1610a06b48504503efbd94beae363")
set(CONAN_INCLUDE_DIRS_OPENCV "/home/work/.conan/data/opencv/4.5.2/_/_/package/5d6fbfde15f1610a06b48504503efbd94beae363/include"
"/home/work/.conan/data/opencv/4.5.2/_/_/package/5d6fbfde15f1610a06b48504503efbd94beae363/include/opencv4")
set(CONAN_LIB_DIRS_OPENCV "/home/work/.conan/data/opencv/4.5.2/_/_/package/5d6fbfde15f1610a06b48504503efbd94beae363/lib")
set(CONAN_BIN_DIRS_OPENCV "/home/work/.conan/data/opencv/4.5.2/_/_/package/5d6fbfde15f1610a06b48504503efbd94beae363/bin")
set(CONAN_RES_DIRS_OPENCV "/home/work/.conan/data/opencv/4.5.2/_/_/package/5d6fbfde15f1610a06b48504503efbd94beae363/res")
set(CONAN_SRC_DIRS_OPENCV )
set(CONAN_BUILD_DIRS_OPENCV "/home/work/.conan/data/opencv/4.5.2/_/_/package/5d6fbfde15f1610a06b48504503efbd94beae363/"
"/home/work/.conan/data/opencv/4.5.2/_/_/package/5d6fbfde15f1610a06b48504503efbd94beae363/lib/cmake")
set(CONAN_FRAMEWORK_DIRS_OPENCV )
set(CONAN_LIBS_OPENCV opencv_ml opencv_photo opencv_highgui opencv_videoio opencv_imgcodecs opencv_objdetect opencv_stitching opencv_video opencv_calib3d opencv_features2d opencv_flann opencv_dnn opencv_imgproc opencv_core)
...