`std :: filesystem :: directory_iterator` проблема с компилятором

Многие люди (например, 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

Решение

<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 ...)

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]