Sélectionner une version spécifique de libstdc ++ avec clang

J’utilise clang++ pour comstackr du code C ++. Je suis lié à la bibliothèque standard C ++ de gcc , libstdc++ . Cependant, j’ai plusieurs installations différentes de libstdc++ sur ma machine Ubuntu. Lorsque je lance clang++ , il utilise l’installation 4.8 de libstdc++ :

 andy@andy:~$ clang++-3.5 -v Ubuntu clang version 3.5.0-4ubuntu2~trusty2 (tags/RELEASE_350/final) (based on LLVM 3.5.0) Target: i386-pc-linux-gnu Thread model: posix Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.6 Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.6.4 Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.8 Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.8.4 Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.9 Found candidate GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.9.3 Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.6 Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.6.4 Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.8 Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.8.4 Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9 Found candidate GCC installation: /usr/lib/gcc/i686-linux-gnu/4.9.3 Selected GCC installation: /usr/bin/../lib/gcc/i686-linux-gnu/4.8 Candidate multilib: .;@m32 Selected multilib: .;@m32 

Comment puis-je dire à clang++ d’utiliser une version différente de la bibliothèque et des en-têtes libstdc++ ? spécifiquement, je veux utiliser la version 4.6.

Comme vous l’avez vu depuis la sortie de clang++ -v , il s’agit de la dernière installation de gcc clang++ -v dans un “préfixe” donné (c’est-à-dire un répertoire d’installation).

Le problème avec la façon dont plusieurs versions de gcc sont installées, par exemple sur Ubuntu, est qu’elles utilisent toutes le même préfixe, /usr .

Donc, la solution de contournement que j’utilise est de créer un tas de fausses installations, chacune sous son propre préfixe: /usr/local/gcc/5.5.0 , /usr/local/gcc/6.4.0 , /usr/local/gcc/7.3.0 , etc.:

 VERSION=6.4.0 sudo mkdir -p /usr/local/gcc/$VERSION/include/c++ sudo ln -s /usr/include/c++/$VERSION /usr/local/gcc/$VERSION/include/c++/$VERSION sudo mkdir -p /usr/local/gcc/$VERSION/lib/gcc/x86_64-unknown-linux-gnu sudo ln -s /usr/lib/gcc/x86_64-linux-gnu/$VERSION /usr/local/gcc/$VERSION/lib/gcc/x86_64-unknown-linux-gnu/$VERSION 

Maintenant, je peux demander à clang++ d’utiliser une version spécifique des bibliothèques de gcc avec l’option --gcc-toolchain :

 clang++ --gcc-toolchain=/usr/local/gcc/6.4.0 ... 

Si vous voulez juste utiliser les en-têtes de l’ancienne libstdc ++, il devrait suffire d’append -I/usr/include/c++/4.6 à CFLAGS. La bibliothèque C ++ est compatible avec les versions antérieures.