Ubuntu、opencv和链接

Ubuntu、opencv和链接,ubuntu,opencv,linker,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的“未定义引用”错误。我

几天前我安装了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文件集成功构建,但无法使用库本身构建,为什么会有不同的行为?

在我看来,您正在链接较旧的C库。今天的OpenCV链接命令更像是:
-lopencv\u core-lopencv\u flann-lopencv\u highgui…

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

--编辑--


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

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

这些是opencv2.1.0的吗?我知道他们改变了它,但我从“pkg config opencv--libs”中得到了这些libs,所以我认为它们是正确的——而且当我链接.o文件时,链接也很好,所以看起来这些应该是正确的。。我将检查名为newway的libs是否存在。实际的生产版本是2.3.x,2.4.0是beta版。乌布努图的版本似乎已经很晚了。无论如何,据我记忆所及,即使随着时间的推移添加了一些新模块,libopencv_内核、libopencv_highui、libopencv_imgproc。。。在2.x版本中有此名称模式。有趣。。我没有任何名为“libopencv*”的文件。/usr/lib中的文件名为“libcv.so.2.1.0”“libcvaux.so.2.1.0”等。。在这一点上,如果有帮助的话,我可能会被迫获得2.3.x并从源代码和se构建。不过,这看起来不像是opencv的问题,因为当我从我的源代码链接到.o文件而不是.o文件时,我可以很好地构建。因此,这是从我的源代码构建的。当时我可能弄错了,而这个组织是用opencv 2.2构建的。我更新了我的答案,也许这对你有帮助。但是,是的,我建议你使用一个最近的快照。是的,我尝试了不同的顺序,但没有任何帮助。当我在我的原始帖子上发表评论时,我最终从源代码安装了opencv v2.3.1,问题就消失了。不知道为什么,但我想主要的是它现在起作用了。谢谢你的建议。这正是我正在做的,这就是为什么我不认为这是一个opencv或库命名问题。为了清晰起见,我没有在我的帖子中显示它,但是因为我直接从pkg config获得libs,所以我非常确定我使用的是正确的libs。我将在我的原始问题中添加一条关于“解决方案”的注释。好吧,这不是一个真正的“解决方案”,但我最终从源代码处安装了opencv 2.3.1-还必须安装ffmpeg(具体来说是v0.8!),现在一切都正常了。因此,它显然与我使用apt get获得的opencv构建有关。我还没有尝试过这个,但我猜我可以从源代码安装2.1,它也可以工作。仍然不确定为什么使用库和.o进行编译会是一个问题,但现在一切正常,所以。。。。