在 GCC 6.0 的持续开发过程中尝试利用最新的 C 1z 功能时,会出现一个特殊的链接器错误:编译涉及实验性::filesystem标头的示例代码。
运行时问题会显现出来以下代码:
#include <iostream> #include <experimental/filesystem> namespace fs = std::experimental::filesystem; int main() { fs::path p1 = "/home/pete/checkit"; std::cout << "p1 = " << p1 << std::endl; }
编译此代码会导致以下错误:
undefined reference to `std::experimental::filesystem::v1::__cxx11::path::_M_split_cmpts()'
解决方案:
与最初的假设相反,文件系统 TS 不隶属于 C 1z,而是构成一个独特的规范。文件系统 TS 的 GCC 实现可以在 C 11 模式下访问。要解决链接错误,应将以下标志添加到链接命令中:
-lstdc++fs
此指令保证程序链接到包含实验::文件系统头的必要实现的适当库。
更新:
GCC 的后续版本(8.x 及更高版本)引入支持用于 C 17 文件系统库。它可以通过访问。标头和 std::filesystem 命名空间。在此实现实现稳定性之前,仍然需要链接到 -lstdc fs 才能利用这些功能。
从 GCC 9 开始,可以在没有 -lstdc fs 的情况下使用 C 17 std::filesystem 组件,而 std::experimental ::文件系统符号通过 GCC 13.3 中的 -lstdc exp 提供。
以上是为什么在 C 1z 中使用 `experimental::filesystem` 时出现链接器错误?的详细内容。更多信息请关注PHP中文网其他相关文章!