【问题标题】:Compile error : undefined reference to‘__atomic_fetch_add_4’编译错误:未定义对‘__atomic_fetch_add_4’的引用
【发布时间】:2016-06-23 10:17:31
【问题描述】:
#include <opencv2/opencv.hpp>
using namespace cv;

int main()
{
  Mat img=imread("cornea.jpg");
  imshow("src",img);
  waitKey(0);
  return 0;
}

我编译它:

g++ main.cpp -o main `pkg-config opencv --cflags --libs`

g++ main.cpp -o main -I/usr/local/opencv-3.1.0/include/opencv -I/usr/local/opencv-3.1.0/include -L/usr/local/opencv-3.1.0/lib -lopencv_shape -lopencv_stitching -lopencv_objdetect -lopencv_superres -lopencv_videostab -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core -lpng -lz -ltiff -ljasper -ljpeg -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfontconfig -lgobject-2.0 -lfreetype -lgthread-2.0 -lglib-2.0 -ldc1394 -lv4l1 -lv4l2 -lavcodec -lavformat -lavutil -lswscale -ldl -lm -lpthread -lrt

这给了我:

/tmp/ccoZCMRO.o:in function ‘cv::Mat::release()’:main.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x22):未定义引用‘__atomic_fetch_add_4’
collect2:错误:ld 返回 1 个退出状态

我在VM的ubuntu 14.04终端使用opencv 3.1.0!

【问题讨论】:

  • 可能还有一个更有趣的根本原因需要挖掘,但您尝试过-march=native-latomic 吗?
  • 非常感谢你,我的朋友! -march=native-latomic 都很有用!你能告诉它的根本原因吗?
  • 你需要一些原子操作的实现。 i386 没有合适的原子指令,所以你需要一个库实现(在 libatomic 中)。如果您让编译器知道您实际上对比 i386(比如 i686)更新的机器感兴趣,那么它可以直接使用适当的指令,而您不需要库。

标签: c++ opencv ubuntu gcc


【解决方案1】:

您似乎在混合使用 OpenCV 库的 Debug 和 Release 版本。 https://github.com/Itseez/opencv/issues/5581 您应该只包含和链接正常的 Release 库,或者您自己构建的 Debug 库。

在您的情况下,这可能来自双重包含 -cflags -I /usr/local/include/opencv。我会尝试删除所有手动路径,只写pkg-config --cflags --libs opencv(到打包的发布版本)。

请注意,/usr/local/include 是标准包含路径,将始终被搜索。您可以尝试使用 -nostdinc https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html 排除标准路径

另一种选择是卸载两个版本之一,或从标准路径中删除一个版本。

【讨论】:

  • 我的朋友,当我使用g++ -o main main.cpp pkg-config opencv --cflags --libs opencv``,同样的错误发生!我的 PKG_CONFIG_PATH 链接到一个名为 opencv,pc 的文件。 opencv.pc 包含版本信息、编译和链接参数。
  • 你可能仍然链接错误的库,因为/usr/local/lib/usr/lib总是被搜索,前者优先。我认为仍然值得尝试将您自己的编译版本(/usr/local 版本)删除到非索引文件夹或卸载打包版本,以确保您包含并链接一个相同的版本。
  • 我觉得你的话很有道理。我在安装opencv 3.0.0的时候只是参考了官网,没有关心安装路径/usr/local。当然,根本原因是我不是很懂。 你能告诉我如何卸载 opencv 吗?。我害怕错误地删除其他内容。
  • 你好,这次我安装了opencv 3.1.0,但是问题中提到的错误之一仍然存在!你知道怎么解决吗?
  • @LittleTooth,我编辑了我的答案。除此之外,从 /usr/local 中删除库意味着要么运行make uninstall,要么手动查看那里的所有文件并手动删除它们(因为您没有簿记信息它们属于哪个库)。
【解决方案2】:

在 i386 上,您需要添加 -latomic,因为 GCC 不能使用汇编指令,但必须回退到 libatomic 库实现。

从 i586 开始,原子指令可用,不再需要链接到 libatomic。这意味着,-latomic 的替代方法是使用-march=i586

【讨论】:

    【解决方案3】:

    您可能需要链接到原子库。试试

    -原子

    在您的 GCC 编译命令行中。

    注意:我必须在 ARMv7 设备 (Android) 上使用 CLang 8 进行编译。

    【讨论】:

    • 添加-1的人请为其他人提供反馈
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多