Ubuntu,opencv和链接

时间:2012-05-02 13:56:00

标签: ubuntu opencv linker

我几天前安装了Ubuntu,并使用apt-get安装build_essentials,opencv,highgui等.g ++是4.6.1,opencv似乎是2.1.0 ..我没有从源代码构建opencv。

我们有一些使用opencv功能的软件。让我们假装源文件名为a.cpp和b.cpp。我编译成a.o和b.o然后将它们放入.so库(称之为libab.so)。

最后,有一个带有main的文件(称之为z.cpp)。我尝试从它构建一个可执行文件,但我得到了大量的“未定义的引用”错误到cv :: stuff。我的链接看起来像这样:

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

然后我得到未定义的引用错误(所有这些都是对cv :: stuff)。

有趣的是,如果我直接链接到我的.o文件,它就构建得很好。所以这个:

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

的工作原理。

我读过的所有内容似乎暗示这可能是一个链接行排序问题,但我已经尝试了所有排序排列并得到同样的问题,所以我真的不认为它是我的问题,但我仍然可以是错的。任何人都有任何想法,我怎么能用我的库来构建它,以及为什么如果我使用库中成套的完整的.o文件构建,但不能用库本身构建它会有不同的行为?< / p>

2 个答案:

答案 0 :(得分:14)

您可以将以下标志传递给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}

答案 1 :(得分:3)

在我看来,您正在使用较旧的C库进行链接。今天的OpenCV链接命令更像是:-lopencv_core -lopencv_flann -lopencv_highgui...

我通常首先链接核心模块,因为顺序很重要,然后按字母顺序排列(确保我不会忘记模块)。

- 编辑 -

您是否尝试将-lab放在opencv libs之后?这可能有用,因为库按命令行的顺序链接。