[英]undefined reference when cross-compiling for ARM with static OpenCV libraries
我正在嘗試使用已使用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)的main': ARMtest2.cpp:(.text+0x8a): undefined reference to
'/tmp/ccxNeUbK.o:在函數中cv::Mat::~Mat()': ARMtest2.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x20): undefined reference to
cv :: fastFree(void *)'的cv::Mat::~Mat()': ARMtest2.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x20): undefined reference to
/tmp/ccxNeUbK.o:在函數cv::Mat::release()': ARMtest2.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x30): undefined reference to
cv :: Mat :: deallocate()'的cv::Mat::release()': ARMtest2.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x30): undefined reference to
collect2:錯誤:ld返回1退出狀態
該代碼本身只是一些打印Mat類型變量的簡單測試代碼。
我使用cmake-gui編譯了靜態OpenCV庫。 我選擇了UNIX Makefile,然后選擇了“指定交叉編譯的選項”,在那里我給出了ARM(arm-linux-gnueabihf)gcc和g ++編譯器的路徑。 然后我取消了BUILD_SHARED_LIB的選擇,因此它編譯了靜態庫。 它似乎可以正常編譯,沒有錯誤。 之后,我做了make&sudo make install。
我還使用共享庫進行了嘗試,並且在ARM板上運行良好(一旦將庫復制到板上並導出了庫路徑)。
靜態.a文件很好地放在了build文件夾中。 顯然,當我-L鏈接到它時也可以找到它。 我嘗試過反轉庫的順序,但無濟於事。
所以我有點不知所措。
我解決了 使用普通的--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
行所稱的pkg-config <--something_or_other> opencv
。 並且看到了其他一些在編譯-lrt -lpthread -lm -ldl
時可能會鏈接的東西,雖然我在普通的命令行中嘗試時並不確定,但顯然仍然錯過了一些東西。 但是它起作用了,所以並沒有對它做太多麻煩:)
在您的命令中:
*$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*
旗幟不見了。
嘗試:
$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中(如您所指定)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.