2014-02-16 148 views
2

我想在Mac OS X 10.9上使用qt創建器來構建簡單的OpenCV應用程序。所以我已經使用brew安裝了OpenCv和Qt4:OpenCv + mac os x + qt creator =奇怪的鏈接錯誤?

brew install opencv 
brew install qt4 

然後下載qt創建者。比我做了簡單的項目 - main.cpp中:

#include <QCoreApplication> 
#include <cv.h> 
#include <cxcore.h> 
#include <highgui.h> 
#include <opencv2/opencv.hpp> 
#include <opencv2/highgui/highgui.hpp> 
using namespace cv; 

int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    Mat m; 
    m = Mat(2, 3, 4); 
    cv::threshold(m, m, 123, 200, 1); 
    m = cv::imread("asdasd", 1); //problem is here! 
    return a.exec(); 
} 

和.pro文件:

QT  += core 
QT  -= gui 
TARGET = opencv_test 
CONFIG += console 
CONFIG -= app_bundle 
TEMPLATE = app 
SOURCES += main.cpp 
LIBS += -L/usr/local/lib \ 
    -lopencv_core \ 
    -lopencv_imgproc \ 
    -lopencv_highgui \ 
    -lopencv_objdetect \ 
    -lopencv_calib3d 

INCLUDEPATH += /usr/local/include/opencv 
DEPENDPATH += /usr/local/include/opencv/include 

INCLUDEPATH += $$PWD/../../../usr/local/include 
DEPENDPATH += $$PWD/../../../usr/local/include 
DEPENDPATH += $$PWD/../../../usr/local/lib 

現在怪異的一部分 - 如果我評論這行:m = cv::imread("asdasd", 1); //problem is here!和建設項目,一切都很好 - 它會編譯和鏈接沒有任何問題。所以看起來.dylib文件沒問題,因爲我可以使用OpenCV函數 - Mat對象構造函數和threshold函數。但!如果我不imread註釋行我得到這個錯誤::-1: błąd:symbol(s) not found for architecture x86_64或者更精確地說:

Undefined symbols for architecture x86_64: "cv::imread(std::string const&, int)", referenced from: _main in main.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation)

一般問題只是更大問題的一部分 - 我試圖建立用qt更大的項目創建者,但鏈接程序找不到一些(但不是全部!)函數。在項目中,它使用大量的OpenCV函數連接已經得到了問題只有:

cv::VideoCapture::VideoCapture(std::string const&) 
cv::destroyWindow(std::string const&) 
cv::CascadeClassifier::detectMultiScale(cv::Mat const&, std::vector<cv::Rect_<int>, std::allocator<cv::Rect_<int> > >&, double, int, int, cv::Size_<int>, cv::Size_<int>) 
cv::CascadeClassifier::CascadeClassifier(std::string const&) 
cv::imshow(std::string const&, cv::_InputArray const&) 

在這個項目中,我使用更多的功能(主要是基本的圖像處理 - 門檻,圖像複製,繪製基本圖元,找到輪廓)和鏈接器可以處理它們沒有任何問題。

我已經嘗試過 - 從源代碼構建OpenCv和Qt4(僅使用構建brew install qt4 --from-source)。我已經使用本教程構建了OpenCv - http://sadeepj.blogspot.com/2012/03/installing-and-configuring-opencv-to.html我也嘗試了很多CMAKE選項 - -DCMAKE_OSX_ARCHITECTURES= x86_64或i386和-DCMAKE_CXX_FLAGS="-stdlib=libc++"。我也嘗試過使用gcc(defautt編譯器是clang)版本4.2來構建它,但它失敗了(構建失敗)。 我已經嘗試過OpenCV 2.4.8和2.4.2。 我也試過設置:

CMAKE_CXX_FLAGS += -std=c++11 
CMAKE_CXX_FLAGS += -stdlib=stdlibc++ 

仍然沒有運氣。

我檢查建造名爲.dylib文件是否x86_64的:

/usr/local/lib[master]$ lipo -info libopencv_core.dylib Non-fat file: libopencv_core.dylib is architecture: x86_64

和highgui文件是否包含任何有關imread功能(我知道,這是不是它導出此函數的證明):

/usr/local/lib[master]$ nm libopencv_highgui.dylib | grep imread 
00000000000069b0 T __ZN2cv6imreadERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEi 
0000000000006ac0 t __ZN2cvL7imread_ERKNSt3__112basic_stringIcNS0_11char_traitsIcEENS0_9allocatorIcEEEEiiPNS_3MatE 

可能很重要的信息:Mac OS X 10.9,64位。

/usr/local/lib[master]$ clang --version 
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) 
Target: x86_64-apple-darwin13.0.0 
Thread model: posix 
/usr/local/lib[master]$ gcc --version 
Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn) 
Target: x86_64-apple-darwin13.0.0 
Thread model: posix 

順便說一句 - 是不是很奇怪,其實運行gcc --version運行鐺?

所以問題是 - 我能做些什麼來編譯和構建它?我應該嘗試使用gcc還是別的什麼可以解決這個問題?此外 - 如果有人可以上傳他的圖書館並分享鏈接,所以我可以嘗試與他們會很好。任何能夠解決這個問題的解決方案對我來說都會很好 - 我可以從源碼,使用任何編譯器,鏈接器等構建一切。 - 只是幫助我使它工作,我會很高興:)

+0

mac os x 10.9現在使用clang作爲默認編譯器 – Lefsler

回答

7

好吧 - 終於在4天的搜索後,我已經解決了這個問題。一般解決方案很簡單 - 只需添加:

QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.9 

到您的.pro文件。如果不想將它添加到每一個.pro文件,您可以設置「全局」 - 剛剛成立就在這個文件中:

Qt5.2.0/5.2.0-rc1/clang_64/mkspecs/macx-clang/qmake.conf 

有關此錯誤/問題的詳細信息:
Qt5.1/Qt5.2 + Mac OS 10.9 (Mavericks) + XCode 5.0.2, Undefined symbols for architecture x86_64
http://qt-project.org/forums/viewthread/35646/ < - 大多數在這裏

//編輯:
此解決方案只適用於CLang,沒有gcc的運氣。