Многие люди (например, 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 ..
<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 ...
)
Других решений пока нет …