前言
本蒻苟经过一天的折磨终于在Clion上完成了对C++20模块的使用,下面记录一下我的实验
一、配置实验环境
GCC官网
GCC编译参考
在GCC官网上可以看到不同版本的GCC编译器的C++特性实现情况,我这里选择比较新的GCC编译器进行实验,实验环境在wsl2-Ubuntu-20.04上。
sudo apt update
sudo apt install build-essential flex bison libgmp-dev libmpfr-dev libmpc-dev libisl-dev texinfo zlib1g-dev
wget https://sourceware.org/pub/gcc/releases/gcc-14.2.0/gcc-14.2.0.tar.gz
tar -xvzf gcc-14.2.0.tar.gz
cd gcc-14.2.0
mkdir gcc-build
cd gcc-build
../configure \
--prefix=/usr/local/gcc-14.2.0 \
--enable-languages=c,c++ \
--disable-multilib \
--enable-bootstrap \
--with-system-zlib
make -j4
make install
echo 'export PATH=/usr/local/gcc-14.2.0/bin:$PATH' >> ~/.bashrc
source ~/.bashrc
我的计算机上大概编译了1个半小时最后别忘了切换gcc编译器并检查
sudo update-alternatives --config gcc #好像是这个
#按0 ,1 ,2...选择
g++ --version#检查g++版本
另外,cmake请按源码编译到3.25版本以上(默认的cmake版本好像不行)
ninja请选择1.11.1(不要使用makefile,这个原因在stackoverflow上有)往上
这两个的编译相对简单,在此不赘述
二、编写测试样例
首先gcc上模块接口文件为.cppm
test.cppm
export module test;
export int test1() {
return 0;
}
main.cpp
#include <iostream> //这个要使用import的话gcc官网有,得手动编译
//我连最基本的模块都编译不出来,算了:(
import test;
using namespace std;
int main(int argc,char* argv[])
{
cout<<test1();
return 0;
}
三、手动编译C++模块
这个直接编译不出来(stackoverflow上有为什么是.cpp文件为后缀)
mv test.cppm test.cpp
g++ -std=c++20 -fmodules-ts -c test.cpp -o test.o
g++ -std=c++20 -fmodules-ts -c main.cpp -o main.o
g++ main.o test.o -o test
./test
这里面要注意到-fmodules-ts选项是必须的!编译顺序也很讲究,另外生成的gcm.cache也要注意一下,好多错误都是这个。
理解了g++在干什么,就可以使用cmake(或者makefile,本蒻苟不怎么会写)自动化这个过程
四、使用CMake配置
这里直接给出CMakeLists.txt文件
cmake_minimum_required(VERSION 3.20)
project(ATEST)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
add_compile_options(-fmodules-ts)
add_executable(ATest1)
target_sources(ATest1
PUBLIC
FILE_SET CXX_MODULES FILES
src/test.cppm
)
target_sources(ATest1
PUBLIC
src/main.cpp
)
请注意到cmake里面的每一句脚本都是对繁琐的g++命令行的简化
cmake官网对C++20模块的支持
总结
写不动了(😦)希望对后来者有帮助

531

被折叠的 条评论
为什么被折叠?



