文章目录
- 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.h
、bits/fs_dir.h
、bits/fs_fwd.h
、bits/fs_ops.h
、experimental/filesystem
这5个需要的头文件。
将头文件和库以第三方库的形式进行编译连接,问题解决。
3 建议
冲吧!