架构 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 5.2 Mac 10.10.1 架构 x86_64 的未定义符号