user3379159
user3379159

Reputation: 109

undefined reference when cross-compiling for ARM with static OpenCV libraries

I'm trying to compile a simple test program using static OpenCV libraries that have been compiled using an ARM compiler. But when I try to compile it with the command

$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

This gives

/tmp/ccxNeUbK.o: In function main': ARMtest2.cpp:(.text+0x8a): undefined reference tocv::Mat::ones(int, int, int)' /tmp/ccxNeUbK.o: In function cv::Mat::~Mat()': ARMtest2.cpp:(.text._ZN2cv3MatD2Ev[_ZN2cv3MatD5Ev]+0x20): undefined reference tocv::fastFree(void*)' /tmp/ccxNeUbK.o: In function cv::Mat::release()': ARMtest2.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x30): undefined reference tocv::Mat::deallocate()' collect2: error: ld returned 1 exit status

The code itself is just some simple test code that prints a Mat type variable.

I compiled the static OpenCV library with cmake-gui. I selected UNIX Makefile and then selected 'specify options for cross-compiling' where I gave the path to the ARM (arm-linux-gnueabihf) gcc and g++ compiler. Then I unticked BUILD_SHARED_LIB so it compiled static libraries. It seemed to compile fine without errors. After that I did make & sudo make install.

I also tried it with shared libraries and that worked fine on the ARM board (once I copied the libraries to the board and exported the library path).

The static .a files landed nicely in the build folder. Apparently it can also find it when I -L link to it. I have tried reversing the order of the libraries, but to no avail.

So I'm a bit at a loss what is going wrong.

Upvotes: 0

Views: 3237

Answers (2)

Franck Ulrich Yonga
Franck Ulrich Yonga

Reputation: 1

In your command:

*$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*

The cflags was missing.

Try with:

$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

Assuming here that your cross-compiled headers are saved in /usr/local/include (as you specified).

Upvotes: 0

user3379159
user3379159

Reputation: 109

I solved it. Using the normal --static pkg-config command to compile with OpenCV libraries;

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

Of course I installed the static libraries also to the folder /usr/local/lib where libraries get installed first. But still i don't know what I missed in the command line I tried to use. I had a look in the config file /usr/local/lib/pkgconfig/opencv.pc

Here is whats in it:

# 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}

I believe this is what is being called with the pkg-config <--something_or_other> opencv line. And saw some other things that probably get linked when compiling -lrt -lpthread -lm -ldl Not really sure though as I tried it ina normal command line and I apparently still missed somethings. But it worked, so didn't really bother too much with it much further :)

Upvotes: 0

Related Questions