5

前几天安装了Ubuntu,用apt-get安装了build_essentials、opencv、highgui等。g++是4.6.1,opencv好像是2.1.0..我没有从源码构建opencv..

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

最后,有一个包含 main 的文件(称为 z.cpp)。我尝试从中构建一个可执行文件,但我收到大量 cv:: 东西的“未定义引用”错误。我的链接线看起来像这样:

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 文件成功构建但不能使用库本身构建,为什么会有不同的行为?

4

2 回答 2

17

您可以将以下标志传递给 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}
于 2012-05-02T19:46:27.137 回答
3

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

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

- 编辑 -

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

于 2012-05-02T14:34:59.573 回答