Ubuntu, opencv and linking

2019-01-24 17:27发布

问题:

I installed Ubuntu a few days ago, and used apt-get to install build_essentials, opencv, highgui, etc. g++ is 4.6.1, opencv appears to be 2.1.0.. I didn't build opencv from source..

We have some software that uses opencv functionality. Let's pretend the source files are named a.cpp and b.cpp. I compile to a.o and b.o and then put those into a .so library (call it libab.so).

Finally, there's a file with main in it (call it z.cpp). I try to build an executable from it, but I get a ton of "undefined reference" errors to cv:: stuff. My link line looks something like this:

g++ -fPIC -g z.cpp -L../lib -lab -lml -lcvaux -lhighgui -lcv -lcxcore -o z.out

then I get the undefined reference errors (all of which are to cv:: stuff).

The interesting part is if I link directly with my .o files, it builds just fine. So this:

g++ -fPIC -g z.cpp a.o b.o -lml -lcvaux -lhighgui -lcv -lcxcore -o z.out

works.

Everything I've read seems to imply this is likely a link-line-ordering issue, but I have tried all ordering permutations and get the same problem, so I really don't think its my issue, but I could still be wrong. Anyone have any ideas how I can get this to build with my library, and why it would act differently if I build with the complete set of .o files that are in the library successfully, but can't build with the library itself?

回答1:

You can pass the following flag to g++:

`pkg-config --libs opencv`

For example:

g++ myprogram.cpp `pkg-config --libs opencv` -o myprogram

pkg-config give to the compiler the information about the library for you.

You can look at:

/usr/local/lib/pkgconfig/opencv.pc

This file contains all the relevant information for compilation:

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

Name: OpenCV
Description: Open Source Computer Vision Library
Version: 2.3.1
Libs: -L${libdir} -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann
Cflags: -I${includedir_old} -I${includedir_new}


回答2:

It seems to me that you are linking with the older C libraries. Today's OpenCV link commands would be more like: -lopencv_core -lopencv_flann -lopencv_highgui....

I usually link with the core module first, since order does matter, then follow the alphabet order (to be sure that I don't forget a module).

-- EDIT --

Did you try to put the -lab after opencv libs ? This may do the trick, since the libraries are linked in the order of the command line.