Qt5.1 / Qt5.2 + Mac OS 10.9(Mavericks)+ XCode 5.0.2,架构x86_64的未定义符号

时间:2013-12-03 04:27:42

标签: macos qt opencv undefined x86-64

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

我可以通过终端

编译以下程序
g++ -L/usr/local/lib -lopencv_core -lopencv_highgui \
    -I/usr/local/include  main.cpp

程序a.out正常运行。

但是,当使用Qt 5.1 / 5.2运行此OpenCV程序时, 我得到了“架构x86_64的未定义符号”。

但是,Qt5通常用于简单的HelloWorld c ++程序。

发生了什么事?

这是代码。

#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++无关。 通过使用命令行编译。

有任何想法或建议吗?

3 个答案:

答案 0 :(得分:12)

本期内容已回答此问题

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

在重建之前,请记住清理您的项目。

答案 1 :(得分:0)

如果您来到这里,因为您更改了config+=11并且没有任何反应,请在重建之前尝试清理项目。

答案 2 :(得分:0)

问题不在于系统。在Mac上,您只需要包含imgcodecs标头并包含相应的lib文件。这将解决你遇到的所有麻烦。

-lopencv_imgcodecs