Encore un autre “ld: symbole(s) ne se trouvent pas pour l'architecture x86_64” problème avec boost, cette fois avec mgiza

Je m'excuse de poser cette question; je ne trouve pas de solution qui fonctionne ou est assez clair pour moi à mettre en œuvre. Je suis simplement en train d'essayer d'installer mgiza. Voici le fichier d'INSTALLATION:

cmake .
make
make install

If you want to install to a custom location, add the following flag when you run cmake:
-DCMAKE_INSTALL_PREFIX=/path/to/custom/location

NOTE: Boost Version 1.48 has problem with the code, you can use either 1.46 or 1.50+. Unfortunately 1.48 is shipped with Ubuntu 12.04 LTS, you can either download and compile libboost 1.50+ from their website, or just do this:
sudo apt-get install libboost1.46-all-dev

À l'air facile, droit? En tapant dans cmake . fonctionne sans aucun problème apparent. Malheureusement, make s'exécute dans cette terrible erreur ("les symboles non définis ...") avec boost.

1 warning generated.
Linking CXX executable ../bin/d4norm
Undefined symbols for architecture x86_64:
  "std::string::_Rep::_M_destroy(std::allocator<char> const&)", referenced from:
      boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
  "std::string::_Rep::_S_empty_rep_storage", referenced from:
      boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
  "std::string::assign(char const*, unsigned long)", referenced from:
      boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
  "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)", referenced from:
      boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
  "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::string const&)", referenced from:
      boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
  "std::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()", referenced from:
      boost::system::(anonymous namespace)::generic_error_category::message(int) const in libboost_system-mt.a(error_code.o)
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Basées sur d'autres questions, c'est un problème avec Mavericks, car il utilise clang pour compiler du code c++, ce qui implique que la bibliothèque libc++, pas libstdc++. Pour être complet, et afin que d'autres puissent reproduire mes erreurs, je suis sous OS X 10.9.5, Xcode 6.1, et mon boost version 1.56 (boost a été installée via homebrew).

Maintenant, il y a certains fixer là-bas, à droite? Nous allons passer au travers de certains d'entre eux:

  1. L'application de l'-m32 drapeau: ne s'applique pas parce que le Makefile
    n'ont pas de "g++", et il a également explicitement me dit de ne PAS
    le modifier, parce que c'est un "Cmake" fichier généré.
  2. Ne pas définir quelque chose dans un fichier d'en-tête: ne s'applique pas parce que le code doit être prêt à compiler.
  3. L'ajout d'-stdlib=libstdc++ à l'éditeur de liens: Je ne suis pas sûr de la façon d'ajouter cette page à un make commande? J'ai essayé tout à fait make -stdlib=libstdc++ et tout ce qui semblait éviter les erreurs ci-dessus, il introduit des erreurs supplémentaires: make: *** [all] Error 2 (pas sûr de ce que cela signifie).
  4. La liaison à la bonne bibliothèques boost: Il y a un commentaire qui dit "Vous avez juste besoin de lien vers la bonne bibliothèques boost ... beaucoup de questions/réponses sur la façon de le faire". Malheureusement, je ne pense pas que l'une des questions que l'auteur est lié à l'adresse de mon problème.
  5. La liaison Qt avec boost: Je ne pense pas que ce soit applicable parce que je ne suis pas à l'aide de Qt, et je ne sais pas où je l'avais mis dans un LIBS += [...] boost ligne.
  6. Liaison d'un fichier manquant: Cette question semble être plus sur la liaison lors de l'exécution de g++ mais je suis à l'aide d'un Makefile qui n'ont pas g++ n'importe où.
  7. À l'aide de g++ vs gcc: Je ne sais pas comment je peux changer qui de ces que j'utilise, parce que je suis en utilisant cmake et make...
  8. Modification d'un lien de commande: Encore une fois, je ne sais pas comment je peux changer la compilation de cmake/make à gcc. (Note: à partir de ce point, je vais ignorer la plupart des questions qui sont traitées par l'ajout de quelque chose de gcc ou g++.)
  9. La modification de la bibliothèque c++ standard: la solution consiste à aller dans Xcode et l'évolution des bibliothèques. Je ne pense pas que ce soit la bonne approche et, en tout cas, je serais probablement vis quelque chose si j'ai changé un paramètre dans Xcode (je n'ai aucune expérience avec Xcode GUI).
  10. Associant les bibliothèques dans Xcode: Je pense que c'est un cas similaire en tant que #9 sur cette liste. Ici, la réponse recommande également à l'aide de homebrew au lieu de macports pour l'installation de boost, mais je l'ai déjà dit plus haut, j'ai utilisé homebrew pour l'installation de boost.
  11. Compiler avec clang: Un problème similaire, mais comment puis-je obtenir cmake ou make pour compiler avec clang?
  12. À partir d'un (populaire) bitcoin problème: Maintenant ce semble intéressant! Une tonne de gens ont couru dans mon erreur. Malheureusement, il ne semble pas exister de consensus ou de solution facile. Il y a aussi quelques solutions que je ne sais pas à mettre en œuvre. Par exemple, une solution par "imbolo" il est de compiler boost à l'aide d'un cxxflag drapeau, mais qu'est-ce que cela signifie?

Donc je suis un peu une perte sur la façon d'installer correctement mgiza ... je veux dire, le point de l'ensemble de mgiza me donner cmake et make est ainsi que je ne pas avoir à vous soucier du désordre détails de la compilation de choses, non? Ce n'est pas seulement un mgiza question, bien que, depuis que j'ai rencontré ce problème lors de la tentative de faire make ailleurs. Je comprends le haut niveau idées de (C)Makefiles, mais pas les détails de bas niveau.

essayez cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ .
Merci, mais si cela ne semble forcer l'utilisation de llvm et clang++, j'ai fini par trouver cette erreur suivant make: /bin/sh: $HOME/mgiza/mgizapp/clang++: Aucun fichier ou répertoire. Il se passe littéralement à droite après le démarrage de make.
ensuite, essayez de chemins absolus pour compilateur clang (ne sais pas où il en fait situé dans OSX)
En fait, je pense que votre suggestion a travaillé dans plus de quelque chose d'autre que j'ai fait. J'ai eu Xcode 6.1 et outils de ligne de commande, mais quand j'ai commencé Xcode (en cliquant dans le dossier Applications), il dit qu'il y avait certaines choses qui avaient besoin d'être installé. Peut-être que c'était la solution? Je vais jouer avec mgiza un peu et de lui faire rapport. Il y avait une TONNE de mises en garde, mais pas d'erreur, lorsque vous faites des make. Les avertissements ont été pour la plupart de cette forme: add explicit braces to avoid dangling else [-Wdangling-else]
Bonne question mais sans réponse juste encombre le site web. Si la réponse n'est pas la peine de poster alors peut-être que la question doit être supprimée (en dépit de la voix). DONC est sujet d'un endroit pour trouver des réponses définitives à des questions utiles.

OriginalL'auteur ComputerScientist | 2014-11-16