编译时的 OpenCV g++ 未定义引用在一台机器上有效,但在另一台机器上无效 [重复]

OpenCV g++ undefined reference when compiling works in one machine but not in another [duplicate]

提问人:Zhmel 提问时间:3/21/2022 最后编辑:Zhmel 更新时间:3/23/2022 访问量:575

问:

我面临着显然非常典型的未定义引用,OpenCV 与 g++ 链接。我在两台机器上运行,都安装了 opencv/2.3.14.6,linux 操作系统,使用 pkg-config 编译相同的代码。我检查了'pkg-config opencv --libs',两者的结果相同

-L/usr/local/lib -lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab -lrt -lpthread -lm -ldl

它失败的机器是 CentOS Linux 版本 7.9.2009(将称之为 centos 机器),编译通过 Linux 版本 4.19.0-9-amd64(将称之为 debian 机器)。 在我的代码中,我使用 ,它应该包括所有 opencv 库,但是,我尝试也包括特定的库,相同的结果,debian 机器都很好,centos 机器失败了。我什至尝试运行 OpenCV 文档中的一个示例,其中使用了我标记的大多数功能,得到了相同的结果。这是错误堆栈的一部分,imread、imshow、namedwindow 和 videowriter 也犯了同样的错误,其他一切似乎都很好:#include <opencv2/opencv.hpp>

test.cpp:(.text+0x1af4):对“cv::p utText(cv::Mat&, std::cxx11::basic_string<char, std::char_traits, std::allocator > const&, cv::P oint, int, double, cv::Scalar, int, int, bool)' 的未定义引用

我检查了所有这些函数都存在于所包含的库中,例如,putText 包含在 opencv2/core/core.hpp 中

CV_EXPORTS_W void putText( Mat& img, const string& text, Point org, int fontFace、double fontScale、标量颜色、 int 厚度=1, int lineType=8, bool bottomLeftOrigin=false );

这是我用来编译的命令行

g++ -Wall -std=c++11 -o test test.cpp `pkg-config --cflags --libs opencv`

为了以防万一,还尝试了下一个

g++ -Wall -std=c++11 -o test test.cpp `pkg-config opencv --cflags --libs`

而这个

g++ -Wall -std=c++11 -o test test.cpp $(pkg-config opencv --cflags --libs)

还尝试用直接库列表替换,仍然无法在 centos 机器中编译,我确实需要在 centos 机器中运行,但无法,我检查过的大多数帖子都通过添加缺少命令行、要编译的文件中的代码语法错误、缺少文件或重新安装 opencv 来解决,但这些都没有帮助我。还尝试使用此处推荐的不同 gcc 版本,但结果相同。我想知道我是否可以尝试其他方法,或者我是否注定要使用 debian 机器(centos 机器是一台 HPC 机器,代码需要一周才能在 debian 机器上运行!pkg-config opencv --cflags --libspkg-config opencv --cflags --libs


编辑:对于任何有类似问题的人,请参阅评论并检查双 ABI,就我而言,我正在尝试使用使用不同 gcc 版本编译的外部库,解决方案是确保它们都使用兼容的编译器版本进行编译。

C++ Linux OpenCV 链接器错误 未定义符号

评论

1赞 Ted Lyngmo 3/21/2022
也许您不小心安装了多个版本的 opencv,并且安装中的某些内容被混淆了?考虑到 2.3.14.6 是 2021-12-30 发布的,4.5.5 已经很老了。在我使用的版本(4.3)中,声明在cv::putTextopencv2/imgproc.hpp
2赞 Alan Birtles 3/21/2022
听起来您的 ioencv 库是用旧的 gcc abi 编译的,但您是用新的 abi 编译的(我猜您已经安装了默认为新 abi 的较新版本的 gcc
0赞 Zhmel 3/23/2022
感谢两位的评论,问题已被标记为重复,实际上 ABI 问题似乎是我问题的原因。HPC 机器有多个版本的 gcc 和 opencv 来支持不同的产品,我们可以根据不同的项目需求加载所需的模块,但似乎我需要的一个库是使用 gcc v9 编译的,opencv 是使用 gcc v4 编译的。必须与维护团队交谈,以使用相同的 gcc 版本编译所有必需的外部库。谢谢!

答: 暂无答案