EL8容器中GCC 8.5链接std::filesystem时出现未定义引用错误
问题解决:g++ 8.5 编译C++17 filesystem出现链接错误
核心问题
你的编译命令参数顺序错误,-lstdc++fs必须放在源文件之后,而非前面。
正确编译命令
g++ -std=c++17 test.cpp -lstdc++fs
原因解释
GNU链接器按输入顺序处理文件:
- 如果先写
-lstdc++fs,链接器处理该库时,还未遇到需要它提供符号的目标文件(test.cpp编译生成的.o文件),会直接跳过库的符号加载。 - 反过来先处理test.cpp,链接器发现缺失的
std::filesystem相关符号,再去后面的-lstdc++fs库中查找,就能正确匹配所需符号。
分步验证方案
也可以拆分编译和链接步骤,更清晰地验证效果:
- 仅编译生成目标文件:
g++ -std=c++17 -c test.cpp
- 单独链接目标文件与库:
g++ test.o -lstdc++fs
补充说明
g++ 8.x对C17的std::filesystem属于实验性实现,必须通过-lstdc++fs链接单独的文件系统库;而g 9及以后版本,std::filesystem已整合到主libstdc++库中,无需额外添加该链接参数。
内容的提问来源于stack exchange,提问作者basil
相关产品推荐
相关产品推荐

