2013-10-21 26 views
0

我已經構建了一個基於this post的靜態opencv庫,之後我想爲我的應用程序調用靜態opencv庫。然而,似乎該應用程序無法鏈接的靜態OpenCV庫,它給我下面的警告:調用靜態opencv庫

ld: warning: ignoring file /usr/local/lib/libopencv_core.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/libopencv_core.a 
ld: warning: ignoring file /usr/local/lib/libopencv_highgui.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/libopencv_highgui.a 
ld: warning: ignoring file /usr/local/lib/libopencv_imgproc.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/libopencv_imgproc.a 
ld: warning: ignoring file /usr/local/lib/liblibjasper.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/liblibjasper.a 
ld: warning: ignoring file /usr/local/lib/liblibjpeg.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/liblibjpeg.a 
ld: warning: ignoring file /usr/local/lib/liblibpng.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/liblibpng.a 
ld: warning: ignoring file /usr/local/lib/liblibtiff.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/liblibtiff.a 
ld: warning: ignoring file /usr/local/lib/libzlib.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/libzlib.a 
ld: warning: ignoring file /usr/local/lib/libIlmImf.a, file was built for archive which is not the architecture being linked (i386): /usr/local/lib/libIlmImf.a 

在我看來,該應用程序試圖調用動態OpenCV庫,以及一個簡單的只是調用cv::Mat測試會給我下面的錯誤應用程序:

Undefined symbols for architecture i386: 
    "cv::Mat::deallocate()", referenced from: 
     cv::Mat::release() in main.o 
    "cv::fastFree(void*)", referenced from: 
     cv::Mat::~Mat() in main.o 

編輯: 作爲答案表明,它是不是鏈接問題,而它是連接不同的建築建庫的問題。除此之外,你應該注意另外兩個重要的東西建立和使用靜態OpenCV庫時,有:

  1. 確保它建立僅有效架構(是)。

  2. 你也應該鏈接framework Cocoa;general;-framework QTKit;general;-framework QuartzCore;general;-framework AppKit; opencv_highgui.a使用。

回答

1

我相信通過不傳遞選項到cmake命令行,它確實爲您的機器的本地體系結構(這是默認選項)構建庫,最推測爲x86_64。但是,由於某種原因,您正嘗試在此處構建一個32位應用程序i386應用程序。因此,您的體系結構沒有正確的靜態庫。

您可以通過在32位(-Darch=i386cmake中構建OpenCV或通過構建應用程序64位(本地拱或x86_64,取決於您的構建系統)來解決此問題。

如果您覺得很勇敢,您還可以構建32位和64位靜態庫,將它們組裝成通用二進制文件,並鏈接到該通用庫。

+0

謝謝,但對於應用程序和opencv庫,我使用「我的Mac 32」。通過這樣做,兩者將具有相同的架構。對? – feelfree

+0

我不確定'我的Mac 32'是什麼......確保構建的拱門的唯一方法是在編譯器調用中明確地設置它,或者通過使用cmake選項或添加類似CXXFLAGS =「-arch i386」。順便說一下,除非你正在構建一個非常老的mac,現在應該是64位。 – sansuiso

2

這不是關於不成功的連接這是關於不成功的建設。 '文件是爲歸檔而構建的,而不是被鏈接的架構(i386)'。你需要正確地構建它,所以說,構建正確的架構。

+0

謝謝,但對於應用程序和opencv庫,我使用'我的Mac 32'。我想這樣做,兩者都會有相同的架構。 – feelfree

+0

當你建立共享庫時,你可以使它工作嗎?如果你可能是你,你應該檢查當你從靜態變爲共享時是否還有其他變化發生。也許你可以將'Host:Linux 3.2.0-51-generic x86_64'改爲x86?我不知道關於Linux的問題,但是當我解壓opencv軟件包時,我已經建立了共享和靜態庫,除非必須添加QT_SUPPORT或其他任何東西,否則我不需要自己構建它。 – guneykayim

+0

@gunekayim謝謝,現在我可以成功編譯它。請檢查新編輯的問題。 – feelfree

0

你應該使用建立自己的本地應用程序:

cmake .. -DOpenCV_DIR=/path/to/opencv-3.0.0-beta/build/ -DCMAKE_OSX_ARCHITECTURES=x86_64 

即。強制本地生成爲x86_64,這是什麼opencv版本是