如何在Eclipse C ++中为文件系统添加-lstdc ++ fs?

时间:2018-06-27 13:28:32

标签: c++ eclipse eclipse-cdt

这是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。情况A

enter image description here

2。案例B

enter image description here

1 个答案:

答案 0 :(得分:1)

您提供的示例命令行在一个命令中从源文件创建了一个可执行文件,但通常需要两个步骤完成:

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)之前,而不是之后。 Order matters用于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}

现在一切都好!

更新2:以下功能与快照中突出显示的功能相同。重要的是,不要添加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)

enter image description here