web-dev-qa-db-ja.com

C ++ 17の<filesystem>メンバーを使用したリンクエラー

Ubuntu 16.04でgcc 7.2を使用していますが、C++ 17の新しいファイルシステムライブラリを使用する必要があります。実はexperimental/filesystemというライブラリがありますが、そのメンバーを使用することはできません。たとえば、このファイルをコンパイルしようとすると:

#include <iostream>
#include <string>
#include <experimental/filesystem>
using namespace std;
namespace fs = std::experimental::filesystem::v1;

int main(){
    fs::path p1 = "/usr/share/";
}

次のようなコンパイルエラーが表示されます。

$ g++-7 test.cpp -std=c++17
/tmp/ccfsMnlG.o: In function `std::experimental::filesystem::v1::__cxx11::path::path<char [12], std::experimental::filesystem::v1::__cxx11::path>(char const (&) [12])':
test.cpp:(.text._ZNSt12experimental10filesystem2v17__cxx114pathC2IA12_cS3_EERKT_[_ZNSt12experimental10filesystem2v17__cxx114pathC5IA12_cS3_EERKT_]+0x73): undefined reference to `st
d::experimental::filesystem::v1::__cxx11::path::_M_split_cmpts()'
collect2: error: ld returned 1 exit status

私は何を間違えていますか?ウェブサイトからコピーして貼り付けただけなので、コードに問題はないと思います。間違ったバージョンのgccを使用していますか?また、C++ 17で<experimental/filesystem>だけでなく<filesystem>が必要なのはなぜですか?前もって感謝します。

13
Willie Jeng

フラグ-lstdc++fsを追加します。

$ g++-7 test.cpp -std=c++17 -lstdc++fs

gcc 7.2は、C++ 17の実験的なfilesystem名前空間のみをサポートします。多分gcc 7.3はすでにstd filesystem名前空間をサポートしています。

13
S.M.

古い++およびlibstdc ++バージョンでは、Sudo apt install g++-8の代わりに#include <filesystem>を使用し、#include <experimental/filesystem>をcppreferenceとして使用することもできます。

Ubuntuにgcc 8をインストールする場合、2つの異なるlibstdc ++ライブラリがありますか、または元のライブラリのみが更新されますか?

新しいものは古いもののドロップイン置換として動作するはずですが、おそらく2つになるでしょう。

libstdc++-8-devとともにg++-8がインストールされていることに気付きました。

これは私のために働く:

g++-8 -g -Wall -std=c++17 test.cpp -lstdc++fs

G ++-8を使用しても、ファイルシステムライブラリは自動的にリンクされず、-lstdc++fsを提供する必要があり、言語レベルでは-std=c++17も必要と思われます。

3
Rick