opencv_ml 和 opencv_objdetect 对 cv::ml 的未定义引用

undefined reference to cv::ml with opencv_ml and opencv_objdetect

在开发程序时,尝试用opencv打开一个CSV文件。我写了

#include <opencv2/opencv.hpp>
#include <opencv2/ml.hpp>

// ...
cv::Ptr<cv::ml::TrainData> mlData = cv::ml::TrainData::loadFromCSV("train.csv", 1);

根据 OpenCV 文档,我的 CMakeLists.txt 是

find_package(OpenCV REQUIRED)

include_directories(${OpenCV_INCLUDE_DIRS})
link_directories(${OpenCV_LIBRARY_DIRS})

message(STATUS "${OpenCV_LIBS}")
add_executable(Test ${EXAMPLE_DIR}/test.cpp)
target_link_libraries(Test ${OpenCV_LIBS} ${PROJECT_NAME})

但是我得到了一个未定义的错误:

undefined reference to `cv::ml::TrainData::loadFromCSV(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int, int, int, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char, char)'

我知道这是因为一些 opencv 库没有链接。然而,Print-Info In CMakeLists.txt 告诉我:

-- opencv_calib3d;opencv_core;opencv_dnn;opencv_features2d;opencv_flann;opencv_gapi;opencv_highgui;opencv_imgcodecs;opencv_imgproc;opencv_ml;opencv_objdetect;opencv_photo;opencv_stitching;opencv_video;opencv_videoio

似乎我链接了所有我能链接的库,但我仍然遇到未定义的错误。

好的,经过多次编译和仔细考虑,我终于找到了我程序的问题。

最大的问题是 link 顺序。我只是把 ${OpenCV_LIBS} 放在 ${PROJECT_NAME} 之前。当我写道:

target_link_libraries(Test ${PROJECT_NAME} ${OpenCV_LIBS})
target_link_libraries(Train ${PROJECT_NAME} ${OpenCV_LIBS})

那么一切都好。