未定义符号 x86_64 架构下使用 QT 和 OpenCV

3

我正在使用QT的IDE和OpenCV。在Xcode中,代码可以正常运行,但是当我将它们复制到QT中进行GUI设计时,根本无法工作。我已经疯狂搜索了...

以下是错误信息:

    /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -c -pipe -g -gdwarf-2 -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -mmacosx-version-min=10.9 -Wall -W -fPIE -DQT_CORE_LIB -I../../../../Qt/5.2.1/clang_64/mkspecs/macx-clang -I../Hello -I/usr/local/include -I../../../../Qt/5.2.1/clang_64/lib/QtCore.framework/Versions/5/Headers -I. -I. -F/Users/Chenxi/Qt/5.2.1/clang_64/lib -o main.o ../Hello/main.cpp
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang++ -headerpad_max_install_names -Wl,-syslibroot,/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -mmacosx-version-min=10.9 -o Hello main.o   -F/Users/Chenxi/Qt/5.2.1/clang_64/lib -L/usr/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_objdetect -lopencv_calib3d -framework QtCore 
Undefined symbols for architecture x86_64:
  "cv::imread(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > 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)
make: *** [Hello] Error 1

main.cpp:

所以我认为这应该是与opencv相关的链接错误。

#include <QCoreApplication>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv/cv.h>
#include <iostream>


using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    cout<<"hello world"<<endl;
    Mat test(10,10,CV_8UC1);
    cout<<test.cols<<endl;

    Mat test1 = imread("/Users/master/desktop/FYP/GUI/Demo_db/neg_1.png");

    return a.exec();
}

.pro文件:


QT       += core

QT       -= gui

TARGET = Hello
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app

INCLUDEPATH += /usr/local/include

LIBS += -L/usr/local/lib \
    -lopencv_core \
    -lopencv_imgproc \
    -lopencv_highgui \
    -lopencv_objdetect \
    -lopencv_calib3d


SOURCES += main.cpp

我尝试了这个答案,但对我没有用: QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.6 到 10.9

有人能帮忙吗?谢谢。


请展示您的项目文件。 - László Papp
@LaszloPapp,我刚刚更新了我的问题,现在只是测试Opencv的imread()函数,错误仍然发生。 - foresea
你确定没有混合使用32位和64位吗?Opencv是否已安装在你的/usr/local/lib目录下? - László Papp
是的,我确定。"lipo -info libopencv_core.dylib 非瘦身文件: libopencv_core.dylib 架构: x86_64" 和 "clang --version Apple LLVM version 5.1 (clang-503.0.38) (based on LLVM 3.4svn) Target: x86_64-apple-darwin13.1.0 Thread model: posix" - foresea
你读了这里底部的三行吗?同时,你尝试给编译器传递-stdlib=libc++参数了吗? - László Papp
显示剩余3条评论
1个回答

2

我认为你需要将默认的gnu C++ std实现更改为以下内容,通过传递给你的编译器,也就是预计的clang:

-stdlib=libc++

简而言之,如果你这样做,请不要混用gcc和clang,因为它们不幸的是并非完全abi兼容。您可以检查libopencv使用了哪个编译器进行构建:
otool -L libopencv-version.dylib

1
@OwenZhang:尝试将其放入此变量中:http://qt-project.org/doc/qt-5/qmake-variable-reference.html#qmake-cxxflags。因此,您应编写以下内容:`QMAKE_CXXFLAGS += -stdlib=libc++`。 - László Papp
我在.pro文件的末尾添加了"QMAKE_CXXFLAGS += -stdlib=libc++",但是没有成功...仍然出现相同的错误。 - foresea
抱歉,我对编译器的事情还比较新...你能告诉我VERBOSE的详细信息吗?非常感谢。 - foresea
已经完成了 :) 从命令行运行 make VERBOSE=1,或者在项目设置中添加这些选项以进行构建。 - László Papp
1
@OwenZhang:这个问题解决了吗?如果是,请选择一个答案。 - László Papp
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接