web-dev-qa-db-fra.com

Qt5.1/Qt5.2 + Mac OS 10.9 (Mavericks) + XCode 5.0.2, Symboles non définis pour l'architecture x86_64

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

Je peux compiler le programme suivant via un terminal 

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

Le programme a.out s'exécute normalement.

Cependant, en utilisant Qt 5.1/5.2 pour exécuter ce programme OpenCV, M'a donné "Symboles non définis pour l'architecture x86_64".

Cependant, Qt5 fonctionne normalement pour un programme HelloWorld c ++ simple.

Que se passe-t-il ?

Voici le code.

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

using namespace std ;
using namespace cv ;

int main()
{
    Mat img ;

    img = imread("image.jpg") ;

    return 0;
}

Et c'est le cadre du projet

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

Voici le message de compilation

/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 

avec -v pour afficher l'invocation

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

Et voici le message d'erreur

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

J'ai vérifié que le problème n'avait rien à voir avec -lstdc++ ou -std=c++11 ou -stdlib=libstdc++. En utilisant la compilation en ligne de commande.

Des idées ou des suggestions?

9
maythe4thbewithu

Ce problème est résolu dans ce post 

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

et expliqué par sandy.martel

J'ai cité ici

La distribution binaire Qt est compilée avec -stdlib = libstdc ++ pour être compatible avec 10.6, Xcode 5 sur 10.9 sélectionnera par défaut -stdlib = libc ++ (pour OS X 10.7 et supérieur uniquement). Donc, symbole utilisant des classes de la bibliothèque standard (comme std :: string dans ce cas) ne sera pas résolu correctement au moment du lien. C'est pourquoi vous voyez cette erreur (Symboles non définis pour l'architecture x86_64). Regardez avec quelle bibliothèque standard opencv est construite: Otool -L libopencv_XXX.dylib. Vous devrez la reconstruire avec la bonne ou changer le mkspec de Qt pour utiliser la plus récente.

Je résous cela en changeant ../Qt5.2.0/5.2.0-rc1/clang_64/mkspecs/macx-clang/qmake.conf

de 

QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.6

à 

QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.9

Et rappelez-vous clean votre projet avant de le reconstruire. 

12
maythe4thbewithu

Le problème n'est pas avec le système. Sur Mac, il vous suffit d'inclure l'en-tête imgcodecs et d'inclure les fichiers lib respectifs. Cela résoudra tous vos problèmes.

-lopencv_imgcodecs

0
Anubhav Rohatgi

Au cas où vous seriez venu ici, comme vous avez modifié config+=11 et que rien ne se passe, essayez de nettoyer votre projet avant de le reconstruire.

0
user1767754