编译错误:未定义引用'__ atomic_fetch_add_4'

#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的terminal上使用opencv 3.1.0!

你似乎混合了OpenCV库的Debug和Release版本。 https://github.com/Itseez/opencv/issues/5581您应该只包含并链接到正常的发布库,或者再次您自己构建的调试库&#x3002;

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

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

另一个选项是卸载这两个版本中的一个,或从标准路径中删除一个版本。

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

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