在Ubuntu上使用C++20module特性


前言

本蒻苟经过一天的折磨终于在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模块的支持


总结

写不动了(😦)希望对后来者有帮助

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值