À l'aide de c++11 dans MacOS X et compilé les bibliothèques Boost énigme
Je suis en train de compiler un projet c++ qui utilise c++11 normes largement. Tout allait bien avec à peu -std=c++11, jusqu'à ce que j'ai essayé d'utiliser unordered_map et MacOS simplement n'ont pas l'unordered_map fichier d'en-tête de n'importe où dans usr/include.
J'ai fait quelques recherches et trouvé que l'utilisation d'-stdlib=libc++ serait-il fixer (pas sûr de savoir comment, c'est comme de la magie pour moi, si le fichier à inclure est nulle part dans le système de fichiers). Il a certainement fait. Il a compilé bien, mais l'éditeur de liens ne peut pas le lien pour le boost::program_options que mon programme utilise de manière intensive. Sans -stdlib=libc++, boost des liens parfaitement, mais je perds le unordered_map.
Que dois-je faire pour avoir le dernier C++11 caractéristiques avec Mac OS clang++ compilateur et toujours être en mesure de relier les bibliothèques boost (qui ont été construit à partir des sources sur ce mac)
ps: tout fonctionne très bien dans mon arch linux
mon makefile:
LIBS = -lboost_program_options CXXFLAGS = -stdlib=libc++ -std=c++11
-Wall-g OBJ = fastq.o fastq_reader.o principal.o dégénérer.o interleave.o compléter.o interval_utils.o intervalle.o interval_utils_test_tool.ode la corne de brume: $(OBJ) $(LINK.cc) -o $@ $^ $(LIBS)
La sortie à l'aide d'-stdlib=libc++
$ c++ -stdlib=libc++ -std=c++11 -Wall-g -c -o fastq.o
fastq.rpc c++ -stdlib=libc++ -std=c++11 -Wall-g -c -o
fastq_reader.o fastq_reader.cpp c++ -stdlib=libc++ -std=c++11 -Wall-g
-c -o main.o main.cpp c++ -stdlib=libc++ -std=c++11 -Wall-g -c -o dégénérer.o degenerate.cpp c++ -stdlib=libc++ -std=c++11 -Wall-g
-c -o interleave.o interleave.cpp c++ -stdlib=libc++ -std=c++11 -Wall-g -c -o compléter.o complement.cpp c++ -stdlib=libc++ -std=c++11 -Wall-g -c -o interval_utils.o interval_utils.cpp c++ -stdlib=libc++ -std=c++11 -Wall-g -c -o de l'intervalle.o interval.cpp c++ -stdlib=libc++ -std=c++11 -Wall-g -c -o interval_utils_test_tool.o interval_utils_test_tool.cpp c++ -stdlib=libc++ -std=c++11 -Wall-g
-o de la corne de brume fastq.o fastq_reader.o principal.o dégénérer.o interleave.o compléter.o interval_utils.o intervalle.o interval_utils_test_tool.o
-lboost_program_options les symboles non définis pour l'architecture x86_64: "boost::program_options::to_internal(std::__1::basic_string, std::__1::allocator > const&)",
référencé à partir de:
std::__1::vector, std::__1::allocator >,
std::__1::allocator, std::__1::allocator > > >
boost::program_options::to_internal, std::__1::allocator >(std::__1::vector, std::__1::allocator >,
std::__1::allocator, std::__1::allocator > > > const&)
dans la principale.o... [clipped output for readability]
ld: symbole(s) ne se trouvent pas pour l'architecture x86_64 clang: erreur: l'éditeur de liens
la commande a échoué avec le code de sortie 1 (l'option-v pour voir invocation) faire: *
[corne] Erreur 1
- J'ai la tête à
/usr/include/c++/4.2.1/tr1/unordered_map
est votre xcode jusqu'à ce jour? (Et vous êtes outils de ligne de commande jusqu'à ce jour) - installer boost avec homebrew à l'aide de la "--with-c++11" drapeau et d'être heureux.
- c'est en fait un grand bout bamboon. Je endedup de l'installer à la main.
Vous devez vous connecter pour publier un commentaire.
Après beaucoup de recherche, j'ai appris ce qui suit:
Conclusion:
J'ai donc téléchargé stimuler les sources à partir de leur site web, et compilé à l'aide de la ligne de commande suivante:
Si vous utilisez Homebrew, vous pouvez le faire avec et il va faire la bonne chose pour vous:
Warning: boost: this formula has no --c++11 option so it will be ignored!
clang
dans macOS commencé par défautlibc++
au lieu delibstdc++
. Vous n'avez pas à spécifier explicitement que vous souhaitez que la nouvelle norme C++ plus. Vous devez installer Xcode et clang d'avoir accès à C++11 en-têtes, etc., cependant.