Ubuntu、OpenCV和链接

5
我几天前安装了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::相关的“未定义引用”错误。我的链接行类似于此:
g++ -fPIC -g z.cpp -L../lib -lab -lml -lcvaux -lhighgui -lcv -lcxcore -o z.out

然后我遇到了未定义引用错误(全部是指cv::相关的内容)。

有趣的是,如果我直接链接我的.o文件,它就可以成功构建。所以这样做:

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

工作正常。

我所读的所有内容都表明这很可能是一个链接行顺序问题,但我尝试了所有排序排列并得到了同样的问题,所以我真的不认为这是我的问题,但我仍然可能错了。 有人有任何想法如何使用我的库构建它,以及为什么如果我使用成功的库中完整的.o文件集合构建,但无法使用库本身构建会有不同的行为吗?


好的,所以这并不是一个“解决方案”,但我最终从源代码安装了opencv 2.3.1 - 还必须安装ffmpeg(特别是v0.8!),现在一切正常。因此,显然与我使用apt-get获取的opencv构建有关。我还没有尝试过这个,但我猜我可以从源代码安装2.1,它也会起作用。仍然不确定为什么使用库与.o编译会有问题,但现在一切都正常了,所以... - daroo
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}

1
这正是我所做的,这就是为什么我认为这不是一个opencv或库命名问题的原因。为了清晰起见,我在我的帖子中没有展示它,但由于我直接从pkg-config获取了libs,我相当确定我正在使用正确的libs。我将在我的原始问题中添加一条评论以获得“解决方案”。 - daroo

3

我觉得你正在链接旧版的C库。现在的OpenCV链接命令应该更像:-lopencv_core -lopencv_flann -lopencv_highgui...

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

-- 编辑 --

你尝试过在opencv库之后放置-lab吗?这可能会有帮助,因为库是按照命令行的顺序链接的。


这些是针对opencv2.1.0的吗?我知道他们进行了更改,但我从“pkg-config opencv --libs”中获取了这些库,所以我认为它们是正确的 - 当我链接.o文件时,它也可以正常链接,因此似乎这些必须是正确的.. 我将检查是否存在以新方式命名的库。 - daroo
实际的生产版本是2.3.x,而2.4.0则处于测试版阶段。Ubuntu似乎在版本更新上有些落后。但无论如何,就我个人记忆而言,即使随着时间的推移添加了一些新模块,在2.x版本中 libopencv_core、libopencv_highui、libopencv_imgproc……仍保持这种命名模式。 - sansuiso
有趣...我没有任何名为“libopencv*”的文件。/usr/lib中的文件名为“libcv.so.2.1.0”、“libcvaux.so.2.1.0”等。此时,我可能被迫获取2.3.x并从源代码构建,看看是否有所帮助。但是,鉴于当我链接来自我的源的.o文件而不是从我的源构建的.so时可以很好地构建,这似乎并不像是一个opencv问题。 - daroo
那我可能错了,这个组织是随OpenCV 2.2一起发布的。不过我已经更新了我的答案,也许这会对你有所帮助。但是,我建议你使用更近期的快照。 - sansuiso
是的,我尝试了不同的顺序,但没有什么帮助。正如我在原帖中所评论的那样,最终我从源代码安装了opencv v2.3.1,问题就解决了。不确定为什么,但我想最重要的是现在它可以工作了。感谢所有的建议。 - daroo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接