2020年4月13日月曜日

c++のstd::filesystemでコンパイルエラーが出る

Ubuntu18.04でc++17を学習していたらハマったのでメモ
c++のstd::filesystemを使用したコードをコンパイルできない。

異なる原因が2つあった

原因1
g++-8と明示的に指定してもg++-7が使われていた


まずgcc/g++のバージョンを確認する

g++ -v

ここでバージョン8以下であればg++-8をインストールする

sudo apt install g++-8

インストールしたらg++-8のバージョンを確認する

g++-8 -v

なんとここでversion7を使ってるとの結果が返答された。
g++-8を明示的に指定してもg++-7を参照しているとは夢にも思わなかった。

とりあえずlsコマンドで確認する

ls -l /usr/bin/g++*

lrwxrwxrwx 1 root root  5  5月 21  2019 /usr/bin/g++ -> g++-7
lrwxrwxrwx 1 root root 22 12月  4 23:25 /usr/bin/g++-7 -> x86_64-linux-gnu-g++-7
lrwxrwxrwx 1 root root  5  4月 13 10:24 /usr/bin/g++-8 -> ./g++


上記の例だと
g++
g++-7
g++-8
3つともシンボリックリンクでどれを指定してもx86_64-linux-gnu-g++-7を参照するようになっている。

参照先も確認してみよう

ls -l /usr/bin/x86_64-linux-gnu-g++*


/usr/bin/x86_64-linux-gnu-g++-7
/usr/bin/x86_64-linux-gnu-g++-8
この2つは実態らしい
g++-8の参照先を/usr/bin/x86_64-linux-gnu-g++-8にかえてやればいい

sudo ln -fs x86_64-linux-gnu-g++-8 /usr/bin/g++-8

シンボリックリンクの書き換えを確認する

ls -l /usr/bin/g++*

lrwxrwxrwx 1 root root  5  5月 21  2019 /usr/bin/g++ -> g++-7
lrwxrwxrwx 1 root root 22 12月  4 23:25 /usr/bin/g++-7 -> x86_64-linux-gnu-g++-7
lrwxrwxrwx 1 root root 22  4月 13 14:29 /usr/bin/g++-8 -> x86_64-linux-gnu-g++-8


いい感じ
g++-8のバージョンを再度確認する

g++-8 -v

gcc version 8.4.0 (Ubuntu 8.4.0-1ubuntu1~18.04) 

g++-8を指定してg++-7が参照されることは無くなった

原因2
g++オプションの書き方が間違っていた

最低限必要なオプションは2つ

-std=c++17

-lstdc++fs

この2つをmakefileのgcc_options = にそのまま書くと次のような記述で実行される

g++-8 -std=c++17 -lstdc++fs  -o /path/to/output /path/to/source.cpp

この記述の実行結果はエラーになる

エラーの原因
-lstdc++fs は末尾に書かなければならない

参考
https://stackoverflow.com/questions/57584084/why-does-compiling-filesystem-code-with-c-return-me-this-error

正しい記述はこう

g++-8 -std=c++17 -o /path/to/output /path/to/source.cpp -lstdc++fs

これでコンパイルが通るようになる
makefileもそのように編集する。

おわり