2016-03-09 119 views
4
#include <opencv2/opencv.hpp> 
using namespace cv; 

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

和我一起編譯:編譯錯誤:未定義的引用 '__ atomic_fetch_add_4'

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):undefined reference to‘__atomic_fetch_add_4’
collect2: error: ld returned 1 exit status

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

+2

可能有一個更有趣的根本原因挖掘,但你有沒有嘗試過'-march = native'或'-latomic'? –

+0

非常感謝你,我的朋友! '-march = native'和'-latomic'都很有用!你能說出它的根源嗎? –

+1

你需要一些原子操作的實現。 i386沒有合適的原子指令,所以你需要一個庫實現(在libatomic中)。如果你讓編譯器知道你實際上比i386更感興趣(比如i686),那麼它可以直接使用適當的指令,而你不需要庫。 –

回答

0

您似乎混合了OpenCV庫的Debug和Release版本。 https://github.com/Itseez/opencv/issues/5581 您應該只包含並鏈接到正常的發行庫,或者再次鏈接您自己構建的調試庫。

在你的情況下,這可能來自雙包括-cflags -I /usr/local/include/opencv。我會嘗試刪除所有手動路徑,並只寫pkg-config --cflags --libs opencv(打包發行版)。

請注意,/usr/local/include是一個標準的包含路徑,將始終被搜索。您可以嘗試排除標準路徑-nostdinchttps://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html

另一種選擇是卸載兩個版本中的一個,或從標準路徑中刪除一個版本。

+0

我的朋友,當我使用'g ++ -o main main.cpp'pkg-config opencv --cflags --libs opencv''時,發生同樣的錯誤!我的PKG_CONFIG_PATH鏈接到一個名爲opencv,pc的文件。 opencv.pc包含版本信息,編譯和鏈接參數。 –

+0

您可能仍然鏈接錯誤的庫,因爲總是搜索/ usr/local/lib和'/ usr/lib',而前者優先。我認爲仍然值得嘗試刪除自己的編譯版本(/ usr/local)到非索引文件夾或卸載打包版本,以確保包含並鏈接同一個版本。 – SpamBot

+0

我覺得你的話有道理。當我安裝opencv 3.0.0時,我只是提到官方網站而不關心安裝路徑'/ usr/local'。當然,根本原因是我不太瞭解它。 **你能告訴我如何卸載opencv?**。我害怕錯誤地刪除別的東西。 –

0

在i386上,您需要添加-latomic,因爲GCC不能使用匯編程序指令,但必須回退libatomic庫實現。

從i586開始,原子指令可用,並且不再需要鏈接到libatomic。這意味着,-latomic的替代方案是使用-march=i586

相關問題