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もそのように編集する。
おわり
このコメントはブログの管理者によって削除されました。
返信削除