news 2026/4/16 13:32:50

2601C++,编写自己模块

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
2601C++,编写自己模块

编写一个模块并调用

看一下自定义模块的代码:

//exportdemo.hexportmoduledemo;importstd;namespacedemo{exportintAdd(int,int);exportclassexportDemo{public:exportDemo();public:voiddisplay();};}//exportdemo.cppmoduledemo;importstd;namespacedemo{intAdd(inta,intb){returna+b;}exportDemo::exportDemo(){}voidexportDemo::display(){std::cout<<"this is demo module!"<<std::endl;}}

标准的头文件cpp文件,再看一下调用代码:

importstd;importdemo;intmain(){demo::exportDemo d;d.display();std::cout<<"main app!"<<"Add return:"<<demo::Add(1,2)<<std::endl;return0;}

首先使用命令行编译:

1.先编译std.o.

g++-std=c++23-fmodules-ts-fsearch-include-path-c bits/std.cc

当前目录下可发现生成的std.ogcm目录.

2.编译模块文件

g++-std=c++23-fmodules-ts-c exportdemo.h

会报一个错误略.
看错误的说明是不能在头文件放置模块声明,好,那就随便起一个名字,比如exportdemo.cm,再次编译:

g++-std=c++23-fmodules-ts-c exportdemo.cm

会报另一个警告和一个错误略:

看这样子应该是没找到相关输入文件.再次修改文件名exportdemo.cppm重新编译:

g++-std=c++23-fmodules-ts-c exportdemo.cppm

成功编译.给大家留一个问题,该模块文件名是否可随便取 叫exportdemo.ixxexportdemo.ccm,exportdemo.cxxm可不可 还有没有其它的规则限制
在成功编译模块的基础上继续编译.

3.编译所有单元

g++-std=c++23-fmodules-ts-o demo exportdemo.cpp main.cpp

成功编译,在当前路径下有一个示例``可执行文件,执行它:

./demo

说明编译流程整体走通,没有问题.

使用cmake编译

先看一下cmakelists.txt的文件内容:

cmake_minimum_required(VERSION3.31.6)set(CMAKE_EXPERIMENTAL_CXX_IMPORT_STD"0e5b6991-d74f-4b3d-a41c-cf096e0b2508")set(CMAKE_CXX_COMPILER"clang++")set(CMAKE_C_COMPILER"clang")set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS} -stdlib=libc++")set(CMAKE_EXE_LINKER_FLAGS"${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++")set(CMAKE_CXX_EXTENSIONS OFF)set(CMAKE_CXX_STANDARD23)set(CMAKE_CXX_STANDARD_REQUIRED ON)set(CMAKE_CXX_MODULE_STD1)set(CMAKE_EXPORT_COMPILE_COMMANDS ON)project(cmakeMouduleFirst LANGUAGES CXX)add_executable(cmakeMouduleFirst)target_sources(cmakeMouduleFirst PRIVATE main.cpp exportdemo.cpp PRIVATE FILE_SET demoMmodules TYPE CXX_MODULES FILES exportdemo.cppm)

文件内容整体和上次的不大差别,主要是增加了新增模块的引用,在target_sources增加相关模块文件编译文件.然后使用cmake编译:

mkdir build&&cd build cmake-G Ninja..

这是原来用g++编译才报得错误啊,想了一下,忽然想到刚刚编译了一个最新cmake4.0,并临时在环境变量里了指定.
会不是是该原因呢 然后查看了一下cmake版本,果然是4.0,重新打开一个终端,再次查看了一下cmake版本,是3.31.6.
重新使用上面的命令编译:

cmake-G Ninja..

成功编译.这就是那个cmake"CMAKE_EXPERIMENTAL_CXX_IMPORT_STD"对应的ID的问题.执行编译后的可执行文件,可渲染与直接编译相同结果.

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/12 15:21:28

论文导师不会说!7款免费AI工具内幕,查重低于8%还原创

开头&#xff1a;90%学生不知道的论文“黑科技”&#xff0c;导师私藏的学术捷径 “论文初稿写了3天&#xff0c;导师一句‘逻辑混乱’打回重写&#xff1b;查重率30%&#xff0c;改到凌晨两点还是飘红&#xff1b;参考文献格式调了10遍&#xff0c;依然被批‘不规范’……” …

作者头像 李华
网站建设 2026/4/16 11:55:49

基于Doris的实时数据仓库建设:从理论到实践的完整指南

基于Doris的实时数据仓库建设:从理论到实践的完整指南 关键词:实时数据仓库、Apache Doris、MPP架构、向量化执行、数据湖仓一体、实时数据分析、ETL/ELT 摘要: 本文系统讲解基于Apache Doris构建实时数据仓库的完整技术体系,涵盖理论架构、核心原理、实战操作与应用落地。…

作者头像 李华
网站建设 2026/4/16 9:20:03

基于STM32的电子时钟设计与实现

基于STM32的电子时钟设计与实现摘要本文设计并实现了一款基于STM32单片机的电子时钟系统。该系统采用STM32F103C8T6单片机为核心控制单元&#xff0c;配合8位共阳数码管、矩阵键盘、LED指示灯和独立按键等硬件模块&#xff0c;实现了精确到毫秒的时间显示和设置功能。系统通过P…

作者头像 李华
网站建设 2026/4/16 10:58:07

通信原理篇---连续谱和离散谱

第一幕&#xff1a;终极比喻——两种不同的“雨”想象你在观察下雨&#xff1a;场景A&#xff1a;毛毛雨&#xff08;连续谱&#xff09;特点&#xff1a;无数细小雨滴连续均匀地落下。你看不到单个雨滴的明显间隔&#xff0c;只觉得是一片雨幕。用盆接雨&#xff0c;水位平稳连…

作者头像 李华
网站建设 2026/4/16 9:21:20

学习笔记——HC-SR04 超声波测距传感器

HC-SR04 超声波测距传感器1. 实物图及主要参数指标实物外观模块尺寸&#xff1a;45mm 20mm 15mm包含一个超声波发射器和一个接收器4个引脚&#xff1a;VCC、Trig、Echo、GND技术参数指标参数数值说明工作电压DC 5V典型工作电压工作电流15mA静态电流小于2mA感应角度≤15探测锥…

作者头像 李华
网站建设 2026/4/16 9:21:55

论文AI率99%还有救吗?别放弃,这样改

有同学发来检测结果&#xff1a;AI率99%&#xff0c;还有救吗&#xff1f; 别放弃&#xff0c;99%也能救回来。今天分享方法。 一、先别慌&#xff0c;分析原因 99%这么高&#xff0c;通常是因为&#xff1a; 论文是用AI工具生成的 或者写作风格太"标准化" 不管是…

作者头像 李华