【问题标题】:Qt5.1/Qt5.2 + Mac OS 10.9 (Mavericks) + XCode 5.0.2, Undefined symbols for architecture x86_64Qt5.1/Qt5.2 + Mac OS 10.9 (Mavericks) + XCode 5.0.2,架构 x86_64 的未定义符号
【发布时间】:2013-12-19 00:32:57
【问题描述】:

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

有什么想法或建议吗?

【问题讨论】:

  • 您似乎没有在 OpenCV 中进行链接。或 imread 不在您链接的目录中
  • 感谢您的评论。我也认为问题出在链接器上。我试图运行一个简单的 boot:filesystem 程序。它给了我同样的错误。
  • 问题可能是您需要链接另一个组件,例如-lopencv_core -lopencv_highgui -lopencv_somethingforimages
  • 因为我可以在终端中编译 "g++ -L/usr/local/lib -lopencv_core -lopencv_highgui -I/usr/local/include main.cpp" 我认为这个问题不是由失踪的-l。任何方式都可以为您提供帮助,但我认为我应该回到 Mac OS X10.8,因为我已经为此工作了 5 天。
  • 好吧,如果您多次安装该库,您最终可能会得到不同版本的库...您可以找到您正在使用的版本并尝试使用 nm 读取符号看看它是否在图书馆里。

标签: macos qt opencv undefined x86-64


【解决方案1】:

这个问题在这篇文章中得到了解答

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 )在链接时将无法正确解析。 这就是您看到此错误 (Undefined symbols for architecture 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

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

【讨论】:

  • 请注意,虽然您可以更改部署目标并且一切都将正常链接,但您仍然必须确保两个可能的 C++ 运行时库(libc++ 和 libstdc++)中只有一个会出现在您的最终版本中程序。将使用其中一个运行时分配的对象传递给使用另一个运行时的库会导致崩溃。您需要确保您尝试使用的所有导出 C++ API 的库都是针对相同的 C++ 运行时构建的。
  • 我改了QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.9,还是不行,为什么
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    -lopencv_imgcodecs

    【讨论】:

      猜你喜欢
      • 2013-02-07
      • 2013-06-10
      • 2016-03-25
      • 2012-04-26
      • 2017-08-21
      • 1970-01-01
      • 1970-01-01
      • 2014-10-28
      • 1970-01-01
      相关资源
      最近更新 更多