`std :: filesystem :: directory_iterator` проблема с компилятором - PullRequest
0 голосов
/ 24 сентября 2018

Многие люди (например, 1 , 2 ) спрашивали о том, как заставить std::filesystem::directory_iterator работать, но у меня все еще есть проблемы после того, как я прочитал их.

Я пытаюсь создать небольшую статическую библиотеку.После добавления итератора каталога в некоторые исходные файлы я обновил свой gcc и добавил бит -lstdc++fs, но, похоже, ничего не работает, потому что я получаю сообщение об ошибке

fatal error: filesystem: No such file or directory
 #include <filesystem>

Если я печатаю gcc --version, Я получаю

gcc (Ubuntu 7.3.0-16ubuntu3) 7.3.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

И если я наберу gcc-8 --version, я получу

gcc-8 (Ubuntu 8.1.0-1ubuntu1) 8.1.0
Copyright (C) 2018 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Вот мой маленький сценарий оболочки, который компилирует все.Я тоже попробовал несколько других вариантов.

EIGEN=/usr/include/eigen3

cd ./bin
for file in ../src/*cpp; do
        g++ -std=c++11 -fPIC -c -I$EIGEN -I../include -O3 $file "-lstdc++fs"
done    
ar crv libfoo.a *.o
cd ..

1 Ответ

0 голосов
/ 24 сентября 2018

<filesystem> был добавлен в стандартную библиотеку C ++ только с C ++ 17.

g++ 7.3 (по умолчанию g++) не полностью соответствует этому баллу.Он не найдет <filesystem> с -std=c++17.Разумно, он не найдет <filesystem> с -std=c++11, о чем просит ваш опубликованный скрипт.Но он найдет <experimental/filesystem> с std=c++11 или позже.

У вас также есть g++-8 (предположительно, g ++ 8.1 / 8.2).Он найдет <filesystem> с std=c++17:

$ cat main.cpp 
#include <filesystem>

int main()
{
    return 0;
}
$ g++-8 -std=c++17 main.cpp && echo $?
0

И, как ни странно, он также сделает это с std=c++11 или std=c++14:

$ g++-8 -std=c++11 main.cpp && echo $?
0
$ g++-8 -std=c++14 main.cpp && echo $?
0

С g++-8 вам не нужно будет связывать переходную библиотеку libstdc++fs.

(кстати, умные деньги всегда дают строгие предупреждения при компиляции: ... -Wall -Wextra ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...