我在Eclipse CDT IDE中为Raspberry Pi交叉编译OpenCV库(2.4.9)和Raspicam(0.1.3)。我正在尝试编译一个如下所示的基本应用程序:
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/opencv.hpp>
#include <raspicam.h>
#include <raspicam_cv.h>
using namespace std;
using namespace cv;
int main()
{
....
namedWindow(output_window_name, CV_WINDOW_AUTOSIZE);
namedWindow(grayscale_window_name, 100);
namedWindow(thresholded_window_name, 100);
namedWindow(contours_window_name, 100);
moveWindow(grayscale_window_name, 20,20);
moveWindow(thresholded_window_name, 20, 250);
moveWindow(contours_window_name, 20, 600);
vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_JPEG_QUALITY);
compression_params.push_back(100);
raspicam::RaspiCam_Cv Camera;
....
}
要编译,我确保libopencv_*.so
文件位于交叉编译sysroot中,并使用-l
标记(例如-lopencv_core -lopencv_highgui
等)在Eclipse中链接。我还包括每个include/
Eclipse构建设置中使用-I标志的源文件夹。
使用#include
和namespace
声明进行包含不会导致任何错误。
目标建筑在控制台中如下所示:
arm-linux-gnueabihf-g++
-L"C:\SysGCC\Raspberry\arm-linux-gnueabihf\sysroot\usr\lib"
-L"C:/SysGCC/Raspberry/arm-linux-gnueabihf/sysroot/usr/lib/arm-linux-gnueabihf"
-L"C:\rpi-eclipse\workspace\RaspberryTest\libbluetooth"
-L"C:\SysGCC\Raspberry\arm-linux-gnueabihf\sysroot\lib"
-Wl,-rpath-link,"C:\SysGCC\Raspberry\arm-linux-gnueabihf\sysroot\lib\arm-linux-gnueabihf"
-o "RaspberryTest" ./src/<ALL OBJS>
-lwiringPi
-lopencv_calib3d
-lopencv_core
-lopencv_features2d
-lopencv_flann
-lopencv_highgui
-lopencv_imgproc
-lopencv_ml
-lopencv_objdetect
-lopencv_video
-lbluetooth
-lpthread
-lwiringPiDev
但是,存在以下错误:
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:115: undefined reference to `cv::namedWindow(std::string const&, int)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:116: undefined reference to `cv::namedWindow(std::string const&, int)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:117: undefined reference to `cv::namedWindow(std::string const&, int)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:118: undefined reference to `cv::namedWindow(std::string const&, int)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:120: undefined reference to `cv::moveWindow(std::string const&, int, int)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:121: undefined reference to `cv::moveWindow(std::string const&, int, int)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:122: undefined reference to `cv::moveWindow(std::string const&, int, int)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:129: undefined reference to `raspicam::RaspiCam_Cv::RaspiCam_Cv()'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:131: undefined reference to `raspicam::RaspiCam_Cv::open()'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:194: undefined reference to `raspicam::RaspiCam_Cv::grab()'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:195: undefined reference to `raspicam::RaspiCam_Cv::retrieve(cv::Mat&)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:208: undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:208: undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:211: undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:211: undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:215: undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:215: undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:219: undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:219: undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:220: undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:220: undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:220: undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:224: undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:224: undefined reference to `cv::floodFill(cv::_OutputArray const&, cv::Point_<int>, cv::Scalar_<double>, cv::Rect_<int>*, cv::Scalar_<double>, cv::Scalar_<double>, int)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:228: undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:228: undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:233: undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:233: undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:238: undefined reference to `cv::_InputArray::_InputArray(cv::Mat const&)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:238: undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:240: undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:240: undefined reference to `cv::findContours(cv::_OutputArray const&, cv::_OutputArray const&, cv::_OutputArray const&, int, int, cv::Point_<int>)'
C:\rpi-eclipse\workspace\RaspberryTest\Debug/../src/tasks/image_processing_task.cpp:129: undefined reference to `raspicam::RaspiCam_Cv::~RaspiCam_Cv()'
./src/tasks/image_processing_task.o: In function `cv::Mat::clone() const':
C:\rpi-eclipse\workspace\RaspberryTest\opencv-2.4.9\modules\core\include/opencv2/core/mat.hpp:335: undefined reference to `cv::_OutputArray::_OutputArray(cv::Mat&)'
./src/tasks/image_processing_task.o: In function `cv::_InputArray::_InputArray(cv::Scalar_<double> const&)':
C:\rpi-eclipse\workspace\RaspberryTest\opencv-2.4.9\modules\core\include/opencv2/core/mat.hpp:1137: undefined reference to `vtable for cv::_InputArray'
./src/tasks/image_processing_task.o: In function `cv::_OutputArray::_OutputArray<cv::Point_<int> >(std::vector<std::vector<cv::Point_<int>, std::allocator<cv::Point_<int> > >, std::allocator<std::vector<cv::Point_<int>, std::allocator<cv::Point_<int> > > > >&)':
C:\rpi-eclipse\workspace\RaspberryTest\opencv-2.4.9\modules\core\include/opencv2/core/mat.hpp:1145: undefined reference to `vtable for cv::_OutputArray'
./src/tasks/image_processing_task.o: In function `cv::_OutputArray::_OutputArray<cv::Vec<int, 4> >(std::vector<cv::Vec<int, 4>, std::allocator<cv::Vec<int, 4> > >&)':
C:\rpi-eclipse\workspace\RaspberryTest\opencv-2.4.9\modules\core\include/opencv2/core/mat.hpp:1143: undefined reference to `vtable for cv::_OutputArray'
./src/tasks/image_processing_task.o: In function `cv::_InputArray::_InputArray<cv::Point_<int> >(std::vector<cv::Point_<int>, std::allocator<cv::Point_<int> > > const&)':
C:\rpi-eclipse\workspace\RaspberryTest\opencv-2.4.9\modules\core\include/opencv2/core/mat.hpp:1122: undefined reference to `vtable for cv::_InputArray'
./src/tasks/image_processing_task.o: In function `cv::_OutputArray::_OutputArray<cv::Point_<int> >(std::vector<cv::Point_<int>, std::allocator<cv::Point_<int> > >&)':
C:\rpi-eclipse\workspace\RaspberryTest\opencv-2.4.9\modules\core\include/opencv2/core/mat.hpp:1143: undefined reference to `vtable for cv::_OutputArray'
./src/tasks/image_processing_task.o: In function `cv::_InputArray::_InputArray<cv::Point_<int> >(std::vector<std::vector<cv::Point_<int>, std::allocator<cv::Point_<int> > >, std::allocator<std::vector<cv::Point_<int>, std::allocator<cv::Point_<int> > > > > const&)':
C:\rpi-eclipse\workspace\RaspberryTest\opencv-2.4.9\modules\core\include/opencv2/core/mat.hpp:1125: undefined reference to `vtable for cv::_InputArray'
./src/tasks/image_processing_task.o: In function `cv::_InputArray::_InputArray<cv::Vec<int, 4> >(std::vector<cv::Vec<int, 4>, std::allocator<cv::Vec<int, 4> > > const&)':
C:\rpi-eclipse\workspace\RaspberryTest\opencv-2.4.9\modules\core\include/opencv2/core/mat.hpp:1122: undefined reference to `vtable for cv::_InputArray'
collect2.exe: error: ld returned 1 exit status
make: *** [RaspberryTest] Error 1
这表明我有两种类型的错误。
1 - )未定义的引用(用于函数)
2 - )对vtable的未定义引用`(与我相信的虚函数相关)
为了克服这个问题,我觉得我必须改变STL / C标准,但不知道该怎么做。此外,库被编译和正确包含但仍有未定义的引用这一事实对我来说真的很奇怪。
非常感谢有关如何解决此问题的任何指导。 提前谢谢。