news 2026/8/8 20:31:36

C++23中的自定义模块开发

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++23中的自定义模块开发

一、模块开发

在前面的开发中,基本都是使用标准库中的模块直接调用。在本文中,将自己开发一个模块供程序调用,这样,就可以真正的进入了模块自行开发的实际应用场景。这和前面的动态库开发的思想有些类似,大家可以对比着来看。

二、编写一个模块并调用

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

//exportdemo.hexport module demo;import std;namespace demo{exportintAdd(int,int);export class exportDemo{public:exportDemo();public:voiddisplay();};}//exportdemo.cppmodule demo;import std;namespace demo{intAdd(inta,intb){returna+b;}exportDemo::exportDemo(){}voidexportDemo::display(){std::cout<<"this is demo module!"<<std::endl;}}

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

import std;import demo;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.o和gcm文件夹 2. 编译模块文件 g++ -std=c++23 -fmodules-ts -c exportdemo.h 会报一个错误: exportdemo.h:4:8: error: module-declaration not permitted in header-unit 4 | export module demo;

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

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

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

g++: warning: exportdemo.cm: linker input file unused because linking not done error: exportdemo.cm: linker input file not found: 没有那个文件或目录

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

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

编译成功。给大家留一个问题,这个模块文件名称是否可以随便取?叫exportdemo.ixx或exportdemo.ccm、exportdemo.cxxm可不可以?还有没有其它的规则限制?
再模块编译成功的基础上继续编译:

3. 编译所有单元 g++ -std=c++23 -fmodules-ts -o demo exportdemo.cpp main.cpp

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

./demo this is demo module! main app!Add return:3

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

三、使用cmake编译

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

cmake_minimum_required(VERSION 3.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_STANDARD 23) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_MODULE_STD 1) 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 .. -- The CXX compiler identification is Clang 20.1.8 -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /usr/bin/clang++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done (1.9s) CMake Error in CMakeLists.txt: The "CXX_MODULE_STD" property on the target "cmakeMouduleFirst" requires that the "__CMAKE::CXX23" target exist, but it was not provided by the toolchain. Reason: Experimental `import std` support not enabled when detecting toolchain; it must be set before `CXX` is enabled (usually a `project()` call) -- Generating done (0.0s) CMake Generate step failed. Build files cannot be regenerated correctly.

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

cmake -G Ninja .. -- The CXX compiler identification is Clang 20.1.8 -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /usr/bin/clang++ - skipped -- Detecting CXX compile features CMake Warning (dev) at /usr/share/cmake-3.31/Modules/Compiler/CMakeCommonCompilerMacros.cmake:248 (cmake_language): CMake's support for `import std;` in C++23 and newer is experimental. It is meant only for experimentation and feedback to CMake developers. Call Stack (most recent call first): /usr/share/cmake-3.31/Modules/CMakeDetermineCompilerSupport.cmake:113 (cmake_create_cxx_import_std) /usr/share/cmake-3.31/Modules/CMakeTestCXXCompiler.cmake:83 (CMAKE_DETERMINE_COMPILER_SUPPORT) CMakeLists.txt:19 (project) This warning is for project developers. Use -Wno-dev to suppress it. -- Detecting CXX compile features - done -- Configuring done (0.4s) -- Generating done (0.0s)

编译成功。这就是那个cmake中“CMAKE_EXPERIMENTAL_CXX_IMPORT_STD”对应的ID的问题。执行编译后的可执行文件,可呈现与直接编译相同的结果。

四、总结

对新技术的学习,不用突飞猛进,细雨无声,慢慢掌握即可。其实对于模块编程,目前尚未听说哪家公司已经在大规模的铺开,所以还是有时间慢慢来学习并应用于实践的。

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

Megatron-LM实战指南:解锁大规模Transformer训练的高效密码

Megatron-LM实战指南&#xff1a;解锁大规模Transformer训练的高效密码 【免费下载链接】Megatron-LM Ongoing research training transformer models at scale 项目地址: https://gitcode.com/GitHub_Trending/me/Megatron-LM 痛点解析&#xff1a;为什么传统训练方法在…

作者头像 李华
网站建设 2026/8/7 15:24:31

本技术极限预警算法使强震早期信号识别率提升至95%,行星拓扑模型对月球月震、火星表面构造活动的解释度达89%,为联合国“零灾害风险”目标与深空探测提供坚实安全性支持。

分形纤维丛超统一框架的极限预警突破、灾害风险防控与行星尺度拓展摘要&#xff08;续五&#xff09;为实现地球灾害预警的极限性能提升、全球灾害风险的深度防控及行星科学领域的跨天体拓展&#xff0c;本文从预警精度极限突破、灾害损失量化防控、行星拓扑动力学建模三个维度…

作者头像 李华
网站建设 2026/8/9 1:51:19

基于springboot + vueOA工程项目管理系统(源码+数据库+文档)

工程项目管理 目录 基于springboot vue工程项目管理系统 一、前言 二、系统功能演示 三、技术选型 四、其他项目参考 五、代码参考 六、测试参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 基于springboot vue工程项目管理系统 一、前言 博主介绍&…

作者头像 李华
网站建设 2026/8/7 11:55:15

20 . 多数元素

题目介绍 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 提示&#xff1a; n nums.length1 < n < 5 * 104-109 < n…

作者头像 李华
网站建设 2026/8/9 3:58:31

19 . 只出现一次的数字

题目介绍 给你一个 非空 整数数组 nums &#xff0c;除了某个元素只出现一次以外&#xff0c;其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题&#xff0c;且该算法只使用常量额外空间。 提示&#xff1a; 1 < …

作者头像 李华
网站建设 2026/8/9 13:14:52

第四周算法清单

博主深然觉得在每篇博客后标注&#xff0c;总觉得效率不高。所以以后每周更新&#xff0c;都会附加一篇《清单》。 有了清单&#xff0c;只需要打开清单&#xff0c;然后再单开一个题面。不需要频繁从一个页面跳转…… 是不是很贴心 本周算法清单&#xff1a; 15 . 有效的括…

作者头像 李华