1. ホーム
  2. c++

[解決済み] experimental::filesystem リンカエラー

2022-05-15 21:34:13

質問

gcc6.0での開発の頭で、実際にc++1zの新機能を使おうとしています。

こんな小さな例で試してみると

#include <iostream>
#include <experimental/filesystem>
namespace fs = std::experimental::filesystem;
int main()
{
    fs::path p1 = "/home/pete/checkit";

    std::cout << "p1 = " << p1 << std::endl;
}

得た。

/opt/linux-gnu_6-20151011/bin/g++ --std=c++1z main.cpp -O2 -g -o go
/tmp/ccaGzqFO.o: 関数 `std::experimental::filesystem::v1::__cxx11::path::path(char const (&) [36])' 内で、'std::experimental::filesystem::v1::__cxx11は、'。
/opt/linux-gnu_6-20151011/include/c++/6.0.0/experimental/bits/fs_path.h:167: undefined reference to `std::experimental::filesystem::v1::__cxx11::path::_M_split_cmpts()'.
collect2: エラー: ld が 1 の終了ステータスを返しました。

gcc のバージョンは linux-gnu_6-20151011 のスナップショットです。

c++1zの新機能に対応するためのリンク方法について、何かヒントがあれば教えてください。

どのように解決するのですか?

Filesystem TS は C++1z のサポートとは無関係で、C++1z の作業草案に含まれない完全に別の仕様です。 GCC の実装 (GCC 5.3 以降) は、C++11 モードで利用可能でさえあります。

でリンクする必要があるだけです。 -lstdc++fs でリンクすれば使えます。

(該当するライブラリの libstdc++fs.a は静的ライブラリなので、他の静的ライブラリと同様に、このライブラリには の後に の後に来る必要があります。)

2017年11月更新です。 と同様に、Filesystem TS、GCC 8.x で定義されている C++17 ファイルシステム・ライブラリの実装があります。 <filesystem> で定義され、名前空間 std::filesystem (を使用する場合(注:これらの名前には "experimental" は含まれません)。 -std=gnu++17 または -std=c++17 . GCCのC++17のサポートはまだ完全ではなく、安定していません。 -lstdc++fs にリンクする必要があります。

2019年1月更新です。 GCC 9 からは、C++17 の std::filesystem コンポーネントが -lstdc++fs (がなくても使用できます(ただし std::experimental::filesystem ).