web-dev-qa-db-fra.com

Comment puis-je déterminer et changer la version de la bibliothèque standard C ++ utilisée par g ++?

J'ai un programme C++ que je tente de mettre à jour pour utiliser la bibliothèque std :: filesystem qui se trouve dans la bibliothèque standard du nouveau C++ - 17. J'ai dû installer g ++ version 8 pour obtenir les fonctionnalités C++ - 17. Mon programme est compilé mais il ne crée pas de lien, et je suppose que c’est parce que plusieurs versions de la bibliothèque standard C++ sont installées, une pour g ++ version 7 et une pour g ++ version 8. Il me faut un lien avec libstdc ++ - 8-dev pour Obtenez C++ - 17 fonctionnalités.

Comment puis-je déterminer quelle version de libstdc ++ est utilisée par g ++? Est-il possible de changer de version? Idéalement, je veux plusieurs versions sur mon ordinateur, car certains packages Ubuntu compilent du code C++ et peuvent nécessiter l'ancienne version, mais je veux que mon programme utilise g ++ 8 et Ubuntu utilise tout ce qu'il utilise habituellement.

MISE À JOUR: Les erreurs décrites ci-dessous ont été résolues (voir commentaires). Mais je suis toujours curieux des questions que je pose ci-dessus.

Les erreurs que je reçois sont similaires à celles-ci: https://stackoverflow.com/questions/51252829/stdfilesystemdirectory-iterator-linker-link-c17

Cependant, j'ai essayé leur solution consistant à ajouter l'option -lstdc ++ fs et cela n'a fait aucune différence.

EDIT: J'ai trouvé le fichier de bibliothèque statique pour std :: filesystem et je l'ai lié explicitement en l'ajoutant à la commande de liaison g ++, et les erreurs ont disparu:

g++ $(CXXFLAGS) $(obj) /usr/lib/gcc/x86_64-linux-gnu/8/libstdc++fs.a

Cela suggère qu'il est en effet incapable de trouver la version correcte de la bibliothèque standard lors de la liaison. Pourquoi?

EDIT: Comme demandé ci-dessous, ceci est le résultat de locate libstdc:

/snap/core/5328/usr/lib/x86_64-linux-gnu/libstdc++.so.6  
/snap/core/5328/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21  
/snap/core/5328/usr/share/doc/libstdc++6  
/snap/core/5328/usr/share/gcc-5/python/libstdcxx  
/snap/core/5328/usr/share/gcc-5/python/libstdcxx/__init__.py  
/snap/core/5328/usr/share/gcc-5/python/libstdcxx/v6  
/snap/core/5328/usr/share/gcc-5/python/libstdcxx/v6/__init__.py  
/snap/core/5328/usr/share/gcc-5/python/libstdcxx/v6/printers.py  
/snap/core/5328/usr/share/gcc-5/python/libstdcxx/v6/xmethods.py  
/snap/core/5328/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.21-gdb.py  
/usr/lib/gcc/x86_64-linux-gnu/7/libstdc++.a  
/usr/lib/gcc/x86_64-linux-gnu/7/libstdc++.so  
/usr/lib/gcc/x86_64-linux-gnu/7/libstdc++fs.a  
/usr/lib/gcc/x86_64-linux-gnu/8/libstdc++.a  
/usr/lib/gcc/x86_64-linux-gnu/8/libstdc++.so  
/usr/lib/gcc/x86_64-linux-gnu/8/libstdc++fs.a  
/usr/lib/i386-linux-gnu/libstdc++.so.6  
/usr/lib/i386-linux-gnu/libstdc++.so.6.0.25  
/usr/lib/x86_64-linux-gnu/libstdc++.so.6  
/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25  
/usr/lib32/libstdc++.so.6  
/usr/lib32/libstdc++.so.6.0.25  
/usr/share/doc/libstdc++-7-dev  
/usr/share/doc/libstdc++-8-dev  
/usr/share/doc/libstdc++6  
/usr/share/doc/gcc-7-base/C++/README.libstdc++-baseline.AMD64  
/usr/share/doc/gcc-7-base/C++/changelog.libstdc++.gz  
/usr/share/doc/gcc-7-base/C++/libstdc++_symbols.txt.AMD64  
/usr/share/doc/gcc-8-base/C++/README.libstdc++-baseline.AMD64  
/usr/share/doc/gcc-8-base/C++/changelog.libstdc++.gz  
/usr/share/doc/gcc-8-base/C++/libstdc++_symbols.txt.AMD64  
/usr/share/gcc-8/python/libstdcxx  
/usr/share/gcc-8/python/libstdcxx/__init__.py  
/usr/share/gcc-8/python/libstdcxx/v6  
/usr/share/gcc-8/python/libstdcxx/v6/__init__.py  
/usr/share/gcc-8/python/libstdcxx/v6/printers.py  
/usr/share/gcc-8/python/libstdcxx/v6/xmethods.py  
/usr/share/gdb/auto-load/usr/lib/i386-linux-gnu/libstdc++.so.6.0.25-gdb.py  
/usr/share/gdb/auto-load/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.25-gdb.py  
/usr/share/gdb/auto-load/usr/lib32/libstdc++.so.6.0.25-gdb.py  
/usr/share/locale-langpack/en_GB/LC_MESSAGES/libstdc++.mo  
/var/cache/apt/archives/libstdc++-7-dev_7.3.0-16ubuntu3_AMD64.deb  
/var/cache/apt/archives/libstdc++6_8-20180414-1ubuntu2_i386.deb  
/var/lib/dpkg/info/libstdc++-7-dev:AMD64.list  
/var/lib/dpkg/info/libstdc++-7-dev:AMD64.md5sums  
/var/lib/dpkg/info/libstdc++-8-dev:AMD64.list  
/var/lib/dpkg/info/libstdc++-8-dev:AMD64.md5sums  
/var/lib/dpkg/info/libstdc++6:AMD64.list  
/var/lib/dpkg/info/libstdc++6:AMD64.md5sums  
/var/lib/dpkg/info/libstdc++6:AMD64.postinst  
/var/lib/dpkg/info/libstdc++6:AMD64.prerm  
/var/lib/dpkg/info/libstdc++6:AMD64.shlibs  
/var/lib/dpkg/info/libstdc++6:AMD64.symbols  
/var/lib/dpkg/info/libstdc++6:AMD64.triggers  
/var/lib/dpkg/info/libstdc++6:i386.list  
/var/lib/dpkg/info/libstdc++6:i386.md5sums  
/var/lib/dpkg/info/libstdc++6:i386.postinst  
/var/lib/dpkg/info/libstdc++6:i386.prerm  
/var/lib/dpkg/info/libstdc++6:i386.shlibs  
/var/lib/dpkg/info/libstdc++6:i386.symbols  
/var/lib/dpkg/info/libstdc++6:i386.triggers  

EDIT: Voici un exemple de programme montrant le problème sur ma machine:

#include <filesystem>
#include <iostream>

int main()
{
    std::filesystem::path p = "/";
    std::cout << p;
}

EDIT: J'ai compilé l'exemple de programme avec

g++ -v -Wall -std=c++1z test.cpp

et obtenu cette sortie:

Using built-in specs.
COLLECT_GCC=g++
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/8/lto-wrapper
OFFLOAD_TARGET_NAMES=nvptx-none
OFFLOAD_TARGET_DEFAULT=1
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 8-20180414-1ubuntu2' --with-bugurl=file:///usr/share/doc/gcc-8/README.Bugs --enable-languages=c,ada,c++,go,brig,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --with-as=/usr/bin/x86_64-linux-gnu-as --with-ld=/usr/bin/x86_64-linux-gnu-ld --program-suffix=-8 --program-prefix=x86_64-linux-gnu- --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-vtable-verify --enable-libmpx --enable-plugin --enable-default-pie --with-system-zlib --with-target-system-zlib --enable-objc-gc=auto --enable-multiarch --disable-werror --with-Arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --enable-multilib --with-tune=generic --enable-offload-targets=nvptx-none --without-cuda-driver --enable-checking=release --build=x86_64-linux-gnu --Host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 8.0.1 20180414 (experimental) [trunk revision 259383] (Ubuntu 8-20180414-1ubuntu2) 
COLLECT_GCC_OPTIONS='-v' '-Wall' '-std=c++17' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/8/cc1plus -quiet -v -imultiarch x86_64-linux-gnu -D_GNU_SOURCE test.cpp -quiet -dumpbase test.cpp -mtune=generic -march=x86-64 -auxbase test -Wall -std=c++17 -version -fstack-protector-strong -Wformat-security -o /tmp/cchNMFhq.s
GNU C++17 (Ubuntu 8-20180414-1ubuntu2) version 8.0.1 20180414 (experimental) [trunk revision 259383] (x86_64-linux-gnu)
    compiled by GNU C version 8.0.1 20180414 (experimental) [trunk revision 259383], GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version isl-0.19-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring duplicate directory "/usr/include/x86_64-linux-gnu/c++/8"
ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu"
ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/8/../../../../x86_64-linux-gnu/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/include/c++/8
 /usr/include/x86_64-linux-gnu/c++/8
 /usr/include/c++/8/backward
 /usr/lib/gcc/x86_64-linux-gnu/8/include
 /usr/local/include
 /usr/lib/gcc/x86_64-linux-gnu/8/include-fixed
 /usr/include/x86_64-linux-gnu
 /usr/include
End of search list.
GNU C++17 (Ubuntu 8-20180414-1ubuntu2) version 8.0.1 20180414 (experimental) [trunk revision 259383] (x86_64-linux-gnu)
    compiled by GNU C version 8.0.1 20180414 (experimental) [trunk revision 259383], GMP version 6.1.2, MPFR version 4.0.1, MPC version 1.1.0, isl version isl-0.19-GMP

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 3e256d94cf1a8afbef1b441ddb5fe0dc
COLLECT_GCC_OPTIONS='-v' '-Wall' '-std=c++17' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/bin/x86_64-linux-gnu-as -v --64 -o /tmp/cc4KG8eJ.o /tmp/cchNMFhq.s
GNU assembler version 2.30 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.30
COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/8/:/usr/lib/gcc/x86_64-linux-gnu/8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/8/:/usr/lib/gcc/x86_64-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/8/:/usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/8/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-Wall' '-std=c++17' '-shared-libgcc' '-mtune=generic' '-march=x86-64'
 /usr/lib/gcc/x86_64-linux-gnu/8/collect2 -plugin /usr/lib/gcc/x86_64-linux-gnu/8/liblto_plugin.so -plugin-opt=/usr/lib/gcc/x86_64-linux-gnu/8/lto-wrapper -plugin-opt=-fresolution=/tmp/ccoQuLk2.res -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lgcc --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -pie -z now -z relro /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/Scrt1.o /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/8/crtbeginS.o -L/usr/lib/gcc/x86_64-linux-gnu/8 -L/usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/8/../../.. /tmp/cc4KG8eJ.o -lstdc++ -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc /usr/lib/gcc/x86_64-linux-gnu/8/crtendS.o /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/crtn.o
/tmp/cc4KG8eJ.o: In function `std::filesystem::__cxx11::path::path<char [2], std::filesystem::__cxx11::path>(char const (&) [2], std::filesystem::__cxx11::path::format)':
test.cpp:(.text._ZNSt10filesystem7__cxx114pathC2IA2_cS1_EERKT_NS1_6formatE[_ZNSt10filesystem7__cxx114pathC5IA2_cS1_EERKT_NS1_6formatE]+0x6d): undefined reference to `std::filesystem::__cxx11::path::_M_split_cmpts()'
collect2: error: ld returned 1 exit status
2
user2596667

Mon programme est compilé mais il ne crée pas de lien, et je suppose que c’est parce que plusieurs versions de la bibliothèque standard C++ sont installées, une pour g ++ version 7 et une pour g ++ version 8. Il me faut un lien avec libstdc ++ - 8-dev pour Obtenez C++ - 17 fonctionnalités.

La raison pour laquelle votre programme ne crée pas de lien est que vous ne transmettez pas les paramètres corrects au cours du processus de compilation. Le compilateur peut voir les déclarations de fonction mais l'éditeur de liens ne peut pas trouver les implémentations de la fonction.

Vous devez indiquer au système la version/implémentation à utiliser en indiquant explicitement la version de la bibliothèque que vous souhaitez utiliser. Pour ce faire, utilisez le paramètre -l. Dans votre cas, vous devrez probablement faire précéder le paramètre -l avec le paramètre -L.

Voici un exemple:

g++ myfile.cpp -L/usr/lib/gcc/x86_64-linux-gnu/7 -lstdc++

Si vous avez la v8 installée, à moins que les bibliothèques ne soient installées ailleurs, vous pouvez faire:

g++ myfile.cpp -L/usr/lib/gcc/x86_64-linux-gnu/8 -lstdc++

Ça devrait le faire.

Faites ce qui suit:

Sudo updatedb
locate libstdc

et éditez votre question et postez le résultat. Je vais essayer de construire la commande exacte.

UPDATE: Je peux voir que vous avez:

/usr/lib/gcc/x86_64-linux-gnu/8/libstdc++.a  
/usr/lib/gcc/x86_64-linux-gnu/8/libstdc++.so  
/usr/lib/gcc/x86_64-linux-gnu/8/libstdc++fs.a  

Pouvez-vous voir si cela fonctionne?

g++ test.cpp -std=c++11 -L/usr/lib/gcc/x86_64-linux-gnu/8 -lstdc++
1
marko