Как добавить -lstdc ++ fs в Eclipse C ++ для файловой системы? - PullRequest
0 голосов
/ 27 июня 2018

Вот демо filesystem-testing.cpp на c++ filesystem, которое работает в командной строке:

env: gcc/5.5.0

#include <iostream>
#include <string>
#include <experimental/filesystem>

int main()
{
    std::string path = std::experimental::filesystem::current_path();

    std::cout << "path = " << path << std::endl;
}

Вот компиляция и тестирование:

$ g++ -std=c++11 filesystem-testing.cpp -lstdc++fs
$ ./a.out
path = /home/userid/projects-c++/filesystem-testing

Как добавить -lstdc++fs в Eclipse GCC C++ Compiler и / или GCC C++ Linker?

Следующие способы не работали и имели undefined reference до '_ZNSt12experimental10filesystem2v112current_pathB5cxx11Ev'

1. Дело А

enter image description here

2. Дело B

enter image description here

1 Ответ

0 голосов
/ 28 июня 2018

Пример командной строки, которую вы дали, создает исполняемый файл из исходного файла в одной команде, но обычно это делается в два этапа:

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:

enter image description here

...