我前几天安装了Ubuntu,并使用apt-get来安装build_essentials,opencv,highgui等。g ++是4.6.1,opencv似乎是2.1.0 ..我没有从源代码构buildopencv ..
我们有一些使用opencvfunction的软件。 假设源文件被命名为a.cpp和b.cpp。 我编译成ao和bo,然后把它们放到一个.so库中(称之为libab.so)。
最后,有一个主要的文件(称之为z.cpp)。 我尝试从它build立一个可执行文件,但是我得到了很多cv :: stuff的“未定义参考”错误。 我的链接线看起来像这样:
g++ -fPIC -g z.cpp -L../lib -lab -lml -lcvaux -lhighgui -lcv -lcxcore -o z.out
然后我得到未定义的引用错误(所有这些都是cv ::东西)。
有趣的部分是,如果我直接链接到我的.o文件,它build立得很好。 所以这:
g++ -fPIC -g z.cpp ao bo -lml -lcvaux -lhighgui -lcv -lcxcore -o z.out
作品。
我所读过的所有东西似乎意味着这可能是一个链接sorting的问题,但是我尝试了所有的排列顺序,并得到同样的问题,所以我真的不认为它是我的问题,但我仍然可能是错的。 任何人有任何想法如何我可以得到这与我的图书馆build设,以及为什么它会采取不同的行为,如果我成功地build立了一套完整的.o文件,但不能build立与图书馆本身?
你可以把下面的标志传给g ++:
`pkg-config --libs opencv`
例如:
g++ myprogram.cpp `pkg-config --libs opencv` -o myprogram
pkg-config向编译器提供关于库的信息给你。
你可以看看:
/usr/local/lib/pkgconfig/opencv.pc
该文件包含编译的所有相关信息:
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}
在我看来,你正在与旧的C库链接。 今天的OpenCV链接命令更像是: -lopencv_core -lopencv_flann -lopencv_highgui...
我通常首先与核心模块链接,因为顺序确实重要,然后按照字母顺序(确保我不会忘记一个模块)。
– 编辑 –
你有没有试图把-lab之后的opencv库? 这可能会诀窍,因为库是按照命令行的顺序链接的。