架构 x86_64 的未定义符号将 QT 与 Opencv 结合使用

Posted

技术标签:

【中文标题】架构 x86_64 的未定义符号将 QT 与 Opencv 结合使用【英文标题】:Undefined symbols for architecture x86_64 Using QT with Opencv 【发布时间】:2014-05-17 02:55:13 【问题描述】:

我正在使用 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 to 10.9

谁能帮帮我?谢谢。

【问题讨论】:

请出示您的项目文件。 @LaszloPapp 我刚刚更新了我的问题,我现在只是测试了一个 Opencv 的 imread() 函数,错误仍然存​​在。 @LaszloPapp 你能看看我更新的问题吗? 您确定不混合使用 32 位和 64 位吗?你的 /usr/local/lib 中安装了 Opencv 吗? 是的,我确定。 “lipo -info libopencv_core.dylib 非胖文件:libopencv_core.dylib 是架构:x86_64”和“clang --version Apple LLVM 版本 5.1 (clang-503.0.38)(基于 LLVM 3.4svn)目标:x86_64-apple- darwin13.1.0 线程模型:posix" 【参考方案1】:

我认为您需要将默认的 gnu C++ std 实现更改为以下,方法是将其传递给您的编译器,这可能是 clang:

-stdlib=libc++

简而言之,如果您这样做,请不要混合使用 gcc 和 clang,因为很遗憾它们不是 100% 兼容 abi,​​很遗憾。你可以检查 libopencv 是用哪一个构建的:

otool -L libopencv-version.dylib

【讨论】:

嗨,非常感谢您的回答。我还注意到,在 Xcode 中,我只能在“libstdc++(GNU C++ 标准库)”下使用 Opencv。你能告诉我如何改变QT的设置吗?通过在 .pro 文件中插入“-stdlib=libc++”? @OwenZhang:试着把它放到这个变量中:qt-project.org/doc/qt-5/… 所以,你会写这个:QMAKE_CXXFLAGS += -stdlib=libc++ 我将“QMAKE_CXXFLAGS += -stdlib = libc++”放在 .pro 文件的末尾。但没有运气......同样的错误。 您是否使用 make VERBOSE=1 检查过它实际上已通过编译器?如果没有,您需要提供SSCCE。 对不起,我对编译器很陌生...你能告诉我VERBOSE的细节吗?非常感谢。

以上是关于架构 x86_64 的未定义符号将 QT 与 Opencv 结合使用的主要内容,如果未能解决你的问题,请参考以下文章

Qt + cocoa:架构 x86_64 的未定义符号

Qt 5.2 Mac 10.10.1 架构 x86_64 的未定义符号

架构 x86_64 / i386 的未定义符号

切换到调试时架构 x86_64 的未定义符号

gtest:架构 x86_64 的未定义符号与 clang++ 和 std::vector 错误

Quickblox:架构 x86_64 的未定义符号:错误