本文介绍了Qt5.1/Qt5.2 + Mac OS 10.9 (Mavericks) + XCode 5.0.2,架构 x86_64 的未定义符号的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

环境:Mac OS 10.9 + Qt5.1/Qt5.2 + OpenCV2.4.7 + XCode(5.0.2)

Environment : Mac OS 10.9 + Qt5.1/Qt5.2 + OpenCV2.4.7 + XCode(5.0.2)

我可以通过终端编译以下程序

I can compile the following program via terminal

g++ -L/usr/local/lib -lopencv_core -lopencv_highgui
    -I/usr/local/include  main.cpp

程序a.out正常运行.

The program a.out runs normally.

但是,在使用 Qt 5.1/5.2 运行这个 OpenCV 程序时,我收到了架构 x86_64 的未定义符号".

However, when using Qt 5.1/5.2 to run this OpenCV program,I got "Undefined symbols for architecture x86_64".

然而,Qt5 可以正常工作于一个简单的 HelloWorld c++ 程序.

However, Qt5 works normally for a simple HelloWorld c++ program.

这是怎么回事?

这是代码.

#include <iostream>
#include "opencv2/highgui/highgui.hpp"

using namespace std ;
using namespace cv ;

int main()
{
    Mat img ;

    img = imread("image.jpg") ;

    return 0;
}

这是项目设置

INCLUDEPATH += /usr/local/include

LIBS += -L/usr/local/lib

LIBS += -lopencv_core -lopencv_highgui -v

cache()

TEMPLATE = app
CONFIG += console
CONFIG -= app_bundle
CONFIG -= qt

SOURCES += main.cpp

这里是编译信息

/Users/XXX/Qt5.2.0/5.2.0-beta1/clang_64/bin/qmake -spec macx-clang CONFIG+=debug -o Makefile /Users/XXX/Desktop/untitled/untitled.pro

/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.9.sdk -mmacosx-version-min=10.6 -o untitled main.o   -L/usr/local/lib -lopencv_core -lopencv_highgui -v

使用 -v 显示调用

Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.0.0
Thread model: posix

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ld" -demangle -dynamic -arch x86_64 -headerpad_max_install_names -macosx_version_min 10.6.0 -o untitled -lcrt1.10.6.o -L/usr/local/lib -syslibroot

/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk main.o -lopencv_core -lopencv_highgui -lstdc++ -lSystem

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../lib/clang/5.0/lib/darwin/libclang_rt.osx.a

这是错误信息

Undefined symbols for architecture x86_64:
"cv::imread(std::string const&, int)", referenced from:
      _main in main.o
.... and so on

我检查了问题与 -lstdc++-std=c++11-stdlib=libstdc++ 无关.通过使用命令行编译.

I checked the problem has nothing to do with -lstdc++ or -std=c++11 or -stdlib=libstdc++.by using command line compile.

有什么想法或建议吗?

推荐答案

这个问题在这个帖子中得到解答

This issue is answered in this post

http://qt-project.org/forums/viewthread/35646/

sandy.martel 解释

我在这里引用了

Qt 二进制发行版使用 -stdlib=libstdc++ 编译以与 10.6 兼容,10.9 上的 Xcode 5 将默认选择 -stdlib=libc++(仅适用于 OS X 10.7 和更高版本).因此,使用标准库中的类(如本例中的 std::string)的符号在链接时将无法正确解析.这就是您看到此错误的原因(体系结构 x86_64 的未定义符号).查看 opencv 是用哪个标准库构建的:otool -L libopencv_XXX.dylib.您必须使用正确的方法重建它,或者更改 Qt 的 mkspec 以使用较新的.

我通过更改 ../Qt5.2.0/5.2.0-rc1/clang_64/mkspecs/macx-clang/qmake.conf 来解决这个问题

来自

QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.6

QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.9

并记住在重建之前清理您的项目.

And remember clean your project before rebuild.

这篇关于Qt5.1/Qt5.2 + Mac OS 10.9 (Mavericks) + XCode 5.0.2,架构 x86_64 的未定义符号的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

06-28 19:36