簡體   English   中英

使用靜態OpenCV庫交叉編譯ARM時未定義的引用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM