gcc8.0之前支持C++17但不支持<filesystem>模块的问题

文章目录

  • 1 背景及目的
  • 2 解决过程
    • 2.1 使用<experimental/filesystem>
      • 2.1.1 替换头文件
      • 2.1.2 替换命名空间
      • 2.1.3 添加对库的引用
    • 2.2 生成libstdc++fs.a
      • 2.2.1 下载gcc源码
      • 2.2.2 编译`libstdc++fs`源码
  • 3 建议

1 背景及目的

最近开发一个新的模块,需要涉及到大量文件相关的操作。C++17的<filesystem>模块将文件相关的操作标准化,摒弃了之前需要结合<fstream><sys/stat.h>等多个模块来完成的各种文件操作,非常方便。刚好项目开发的编译选项也是C++17,于是便愉快地进行开发。
开发完成后进行编译时,却遇到了<filesystem>模块找不到的问题。问题的原因在于使用的交叉编译工具链使用的gcc版本是7.3.0版本,但<filesystem>模块需要gcc8.0以上的版本才能支持。糟糕的是交叉编译工具链是第三方提供的,不能如网上其他方法一般进行升级。不甘心回退用之前非标准化方法,故尝试解决此问题。

2 解决过程

2.1 使用<experimental/filesystem>

在C++17正式发布文件系统库<filesystem>之前,文件系统库的功能已经在 C++14 和 C++11 的实验性(Experimental)阶段被引入,这就是<experimental/filesystem>,故可以使用<experimental/filesystem>替换<filesystem>来满足需要。

2.1.1 替换头文件

所有对<filesystem>头文件的引用替换为对<experimental/filesystem>的应用。即:

#include <filesystem>

替换为

#include <experimental/filesystem>

2.1.2 替换命名空间

将所有命名空间的调用从std::filesystem::path替换为std::experimental::filesystem。即:

std::filesystem::path

替换为

std::experimental::filesystem

2.1.3 添加对库的引用

添加上对库的引用-lstdc++fs
例如在原本的CMakeLists.txt文件中的

target_link_libraries(XXX, XXX)

添加上后成为

target_link_libraries(XXX XXX libstdc++fs)

添加完成后编译运行,如果通过则问题解决,跳过2.2,如果问题未解决且提示缺少libstdc++fs,可接着尝试2.2中的方法。

2.2 生成libstdc++fs.a

在完成2.1后进行编译,很幸运地没有提示找不到<filesystem>的头文件了。开心地解决完各种编译报错后再次运行。很不幸,提示缺少libstdc++fs库。因为编译工具链中没包含libstdc++fs库。依然是不能改动工具链,依然是不甘心回退用之前非标准化方法。故考虑编译生成stdc++fs库来解决此问题。

2.2.1 下载gcc源码

首先下载对应版本的gcc源码,因为笔者使用的是gcc7.3.0版本,故输入以下命令

wget http://ftp.gnu.org/gnu/gcc/gcc-7.3.0/gcc-7.3.0.tar.gz
tar -xvf gcc-7.3.0.tar.gz
cd gcc-7.3.0

读者可根据自己的实际情况将命令中的7.3.0替换为需要的版本号。

2.2.2 编译libstdc++fs源码

1 进入 libstdc+±v3 目录

cd libstdc++-v3

2 source对应的工具链
以替换当前终端的gcc版本为工具链的版本。source完成后输入以下指令可以检查gcc是否切换正确:

echo $CC
echo $CXX
echo $CFLAGS
echo $LDFLAGS

3 配置gcc
输入如下指令:

./configure --host=<toolchain-prefix> --prefix=/path/to/install

其中<toolchain-prefix>为2步骤中查看到的对应的gcc的版本(主要是arm和x86之分),/path/to/install替换为自己创建的安装目录路径,可在当前文件夹下创建安装install文件夹进行安装。注意路径要使用绝对路径而非相对路径。
4) 安装
输入如下指令:

make
make install

如果在安装过程中遇到

./config.status: line 2945: ./../../config-ml.in: No such file or directory

的报错,在gcc-7.3.0文件夹的商机目录创建文件config-ml.in即可。
编译完成后,在install/lib文件夹下可以找到生成的libstdc++fs.a库。
libstdc++-v3/include目录下可以找到bits/fs_path.hbits/fs_dir.hbits/fs_fwd.hbits/fs_ops.hexperimental/filesystem这5个需要的头文件。
将头文件和库以第三方库的形式进行编译连接,问题解决。

3 建议

冲吧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值