这是在命令行上工作的filesystem-testing.cpp
c++
上的演示filesystem
:
信封: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.案例A
2.案例B
最佳答案
您提供的示例命令行在一个命令中从源文件创建了一个可执行文件,但是通常通过两个步骤完成:
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
)。UPDATE :好的,我尝试了这个,我发现将标志添加到
Linker flags
是不够的。要了解原因,让我们在“控制台” View 中查看输出:
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链接器的Order matters。要解决此问题,我们需要使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
:关于c++ - 如何在Eclipse C++中为文件系统添加-lstdc++ fs?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51064067/