使用静态OpenCV库对ARM进行交叉编译时的未定义引用

时间:2014-04-29 13:34:36

标签: linux opencv static arm cross-compiling

我尝试使用已使用ARM编译器编译的静态OpenCV库来编译一个简单的测试程序。但是当我尝试使用命令

编译它时
$arm-linux-gnueabihf-g++ `pkg-config --static opencv` -I/usr/local/include -L<path to static libary>  -lopencv_imgproc -lopencv_core ARMtest2.cpp -o ARMtest2

这给出了

  

/tmp/ccxNeUbK.o:在函数main': ARMtest2.cpp:(.text+0x8a): undefined reference to cv :: Mat :: ones(int,int,int)&#39;   /tmp/ccxNeUbK.o:在函数cv::Mat::~Mat()': ARMtest2.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x20): undefined reference to cv :: fastFree(void *)&#39;   /tmp/ccxNeUbK.o:在函数cv::Mat::release()': ARMtest2.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x30): undefined reference to cv :: Mat :: deallocate()&#39;   collect2:错误:ld返回1退出状态

代码本身只是一些打印Mat类型变量的简单测试代码。

我使用cmake-gui编译了静态OpenCV库。我选择了UNIX Makefile,然后选择了指定交叉编译选项&#39;我给了ARM(arm-linux-gnueabihf)gcc和g ++编译器的路径。然后我取消了BUILD_SHARED_LIB,以便编译静态库。它似乎没有错误编译好。之后我做了&amp; sudo make install。

我也尝试使用共享库,并且在ARM板上工作正常(一旦我将库复制到电路板并导出库路径)。

静态.a文件很好地落在了build文件夹中。显然它也可以在我链接到它时找到它。我试图颠倒图书馆的顺序,但无济于事。

所以我有点不知道出了什么问题。

2 个答案:

答案 0 :(得分:0)

我解决了。使用普通的--static pkg-config命令编译OpenCV库;

 `pkg-config --libs --static opencv`

当然我也将静态库安装到文件夹/ usr / local / lib中,首先安装库。但我仍然不知道我试图使用的命令行中遗漏了什么。我查看了配置文件/usr/local/lib/pkgconfig/opencv.pc

这里有什么:

# Package Information for pkg-config

prefix=/usr/local
exec_prefix=${prefix}
libdir=
includedir_old=${prefix}/include/opencv
includedir_new=${prefix}/include

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 2.4.9
Libs:  ${exec_prefix}/lib/libopencv_calib3d.so ${exec_prefix}/lib/libopencv_contrib.so ${exec_prefix}/lib/libopencv_core.so ${exec_prefix}/lib/libopencv_features2d.so ${exec_prefix}/lib/libopencv_flann.so ${exec_prefix}/lib/libopencv_gpu.so ${exec_prefix}/lib/libopencv_highgui.so ${exec_prefix}/lib/libopencv_imgproc.so ${exec_prefix}/lib/libopencv_legacy.so ${exec_prefix}/lib/libopencv_ml.so ${exec_prefix}/lib/libopencv_nonfree.so ${exec_prefix}/lib/libopencv_objdetect.so ${exec_prefix}/lib/libopencv_ocl.so ${exec_prefix}/lib/libopencv_photo.so ${exec_prefix}/lib/libopencv_stitching.so ${exec_prefix}/lib/libopencv_superres.so ${exec_prefix}/lib/libopencv_ts.a ${exec_prefix}/lib/libopencv_video.so ${exec_prefix}/lib/libopencv_videostab.so -lrt -lpthread -lm -ldl
Cflags: -I${includedir_old} -I${includedir_new}

我相信这就是使用pkg-config <--something_or_other> opencv行调用的内容。 并且在编译-lrt -lpthread -lm -ldl时看到了其他一些可能被链接起来的东西。虽然我在正常的命令行中尝试了它并且我显然仍然错过了一些事情但并不确定。 但是它起作用了,所以没有太多关于它的太多了:)

答案 1 :(得分:0)

在你的命令中:

*$arm-linux-gnueabihf-g++ `pkg-config --static opencv` -I/usr/local/include -L<path to static libary>  -lopencv_imgproc -lopencv_core ARMtest2.cpp -o ARMtest2*

缺少cflags。

尝试:

$arm-linux-gnueabihf-g++ `pkg-config --cflags --static opencv` -I/usr/local/include -L<path to static cross-compiled libary> -lopencv_imgproc -lopencv_core ARMtest2.cpp -o ARMtest2

此处假设您的交叉编译头文件保存在/ usr / local / include中(如您所指定)。