CMake ne fonctionne pas avec le C++11 sur OSX
J'ai juste mis à niveau vers Mountain Lion si je peut utiliser une partie de C++11 caractéristiques sur la nouvelle version de Clang qui est fourni avec xcode. Je suis en utilisant cmake 2.8.9 de Homebrew.
J'ai fait un très simple CMake projet qui ajoute les drapeaux du compilateur de C++11:
# CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
add_executable(test test.cxx)
add_definitions(-std=c++0x -stdlib=libc++)
où le code C++ dans l'essai.cxx est la suivante:
#include <iostream>
int main()
{
std::cout << "Howdy" << std::endl;
return 0;
}
Lors de l'exécution de cmake et de faire, le fichier compile très bien, mais alors l'éditeur de liens sorties les erreurs suivantes:
Linking CXX executable test
Undefined symbols for architecture x86_64:
"std::__1::locale::use_facet(std::__1::locale::id&) const", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test.cxx.o
"std::__1::ios_base::getloc() const", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test.cxx.o
"std::__1::basic_ostream<char, std::__1::char_traits<char> >::put(char)", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test.cxx.o
"std::__1::basic_ostream<char, std::__1::char_traits<char> >::flush()", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test.cxx.o
"std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::sentry(std::__1::basic_ostream<char, std::__1::char_traits<char> >&)", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test.cxx.o
"std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::~sentry()", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test.cxx.o
"std::__1::cout", referenced from:
_main in test.cxx.o
"std::__1::ctype<char>::id", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test.cxx.o
"std::__1::locale::~locale()", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::endl<char, std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&) in test.cxx.o
"std::__1::ios_base::__set_badbit_and_consider_rethrow()", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test.cxx.o
"std::__1::ios_base::clear(unsigned int)", referenced from:
std::__1::basic_ostream<char, std::__1::char_traits<char> >& std::__1::operator<<<std::__1::char_traits<char> >(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, char const*) in test.cxx.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [test] Error 1
make[1]: *** [CMakeFiles/test.dir/all] Error 2
make: *** [all] Error 2
Je n'obtiens pas d'erreurs si j'en commentaire le add_definitions ligne dans le CMakeLists.txt fichier, et je peux aussi éviter les erreurs, si je retire le std::cout de la ligne d'essai.cxx. Peut-être le plus étrange dans tout cela est que si je exécutez simplement
clang++ -std=c++0x -stdlib=libc++ test.cxx
il compile très bien! Ainsi, à la suite d'un des auteurs les conseils, j'ai vérifié les commandes à exécuter cmake est en cours d'exécution pour la compilation et la liaison.
Compiler:
/usr/bin/c++ -std=c++0x -stdlib=libc++ -o CMakeFiles/test.dir/test.cxx.o -c /Users/luis/test.cxx
Lien:
/usr/bin/c++ -Wl,-search_paths_first -Wl,-headerpad_max_install_names CMakeFiles/test.dir/test.cxx.o -o test
Le principal problème semble maintenant que l'éditeur de liens ne fournit pas la bonne C++11 drapeaux. Est-il une meilleure façon de fournir ces drapeaux de sorte que le compilateur et le linker va les utiliser?
- Pouvez-vous demander à cmake pour imprimer les commandes en cours d'exécution?
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas sûr que
ADD_DEFINITIONS
est le bon outil pour ce travail particulier.Peut-être une meilleure option est de définir la valeur de
CMAKE_CXX_FLAGS
directement:J'ai vu cette erreur lors de l'exécution de
gcc
plutôt queg++
. Si j'utiliseg++
, les choses compiler correctement. Peut-être que votre Makefile est en utilisant le compilateur avant la fin.Aller à votre projet objectifs->Apple LLVM compilateur 4.1 - Langue->sélectionnez la bibliothèque c++pour
Après l'obtention de cette erreur récemment (à l'aide de Clang) le problème a été en ne passant pas
-std=c++11 -stdlib=libc++
que l'éditeur de liens drapeaux trop.Donc, ils doivent être transmis à la fois comme les drapeaux de compilation et que l'éditeur de liens drapeaux.
Pour GCC le premier drapeau est
-std=c++0x
, au lieu de-std=c++11
.Pour moi, la réponse a été tout simplement à l'aide de
clang++
au lieu declang
.