环境: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#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++
.通过使用命令行编译.
有什么想法或建议吗?
这篇文章回答了这个问题
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
记得在重建之前清理你的项目.