Пример командной строки, которую вы дали, создает исполняемый файл из исходного файла в одной команде, но обычно это делается в два этапа:
g++ -c -std=c++11 filesystem-testing.cpp # creates filesystem-testing.o
g++ filesystem-testing.o -lstdc++fs # creates a.out
Первый шаг вызывает компилятор, второй шаг - компоновщик (g++
является драйвером для обоих).
Обратите внимание, что флаг -lstdc++fs
принадлежит команде компоновщика, а не команде компилятора.
Управляемая система сборки Eclipse также выполняет компиляцию на этих двух этапах. Соответственно, вам нужно указать -lstdc++fs
в параметрах компоновщика (например, Tool Settings | GCC C++ Linker | Linker flags
).
ОБНОВЛЕНИЕ : ОК, я попробовал это, и я вижу, что добавления флага к Linker flags
недостаточно.
Чтобы понять почему, давайте посмотрим на вывод в представлении консоли:
23:13:04 **** Incremental Build of configuration Debug for project test ****
Info: Internal Builder is used for build
g++ -std=c++0x -O0 -g3 -Wall -c -fmessage-length=0 -o test.o ../test.cpp
g++ -lstdc++fs -o test test.o
test.o: In function `main':
/home/nr/dev/projects/c++/test/Debug/../test.cpp:7: undefined reference to `std::experimental::filesystem::v1::current_path[abi:cxx11]()'
collect2: error: ld returned 1 exit status
23:13:05 Build Failed. 1 errors, 0 warnings. (took 880ms)
Обратите внимание, что он показывает вам команды, которые он выполняет. Запущенная команда компоновщика:
g++ -lstdc++fs -o test test.o
Это отличается от того, что я написал выше, одним важным способом: параметры -lstdc++fs
перед входным файлом, который требует его (test.o
), а не после. Заказ имеет значение для компоновщика GCC.
Чтобы исправить это, нам нужно, чтобы Eclipse изменил порядок аргументов в системе сборки. Вы можете сделать это, изменив Tool Settings | GCC C++ Linker | Expert settings | Command line pattern
. Это в основном образец того, как Eclipse создает командную строку компоновщика. Значение по умолчанию:
${COMMAND} ${FLAGS} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS}
Обратите внимание, как ${FLAGS}
(вот куда идет -lstdc++fs
) предшествует ${INPUTS}
(вот куда идет test.o
).
Давайте изменим порядок так:
${COMMAND} ${OUTPUT_FLAG} ${OUTPUT_PREFIX}${OUTPUT} ${INPUTS} ${FLAGS}
И попробуйте снова построить:
23:20:26 **** Incremental Build of configuration Debug for project test ****
Info: Internal Builder is used for build
g++ -o test test.o -lstdc++fs
23:20:26 Build Finished. 0 errors, 0 warnings. (took 272ms)
Теперь все хорошо!
ОБНОВЛЕНИЕ 2: следующее работает, как выделено в снимке. Важно не добавлять -l
: