2601C++,编写自己模块

编写一个模块并调用

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

cpp 复制代码
//exportdemo.h
export module demo;
import std;
namespace demo{
export int Add(int,int);
export class exportDemo
{
public:
    exportDemo();
public:
    void display();
};
}
//exportdemo.cpp
module demo;
import std;
namespace demo{
int Add(int a,int b){return a+b;}
exportDemo::exportDemo() {}
void exportDemo::display(){
    std::cout<<"this is demo module!"<<std::endl;
}
}

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

cpp 复制代码
import std;
import demo;
int main()
{
    demo::exportDemo d;
    d.display();
    std::cout << "main app!"<<"Add return:"<<demo::Add(1,2) << std::endl;
    return 0;
}

首先使用命令行编译:

1.先编译std.o.

cpp 复制代码
g++ -std=c++23 -fmodules-ts -fsearch-include-path -c bits/std.cc

在当前目录下可发现生成的std.o和gcm目录.

2.编译模块文件

cpp 复制代码
g++ -std=c++23 -fmodules-ts -c exportdemo.h

会报一个错误略.

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

cpp 复制代码
g++ -std=c++23 -fmodules-ts -c exportdemo.cm

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

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

cpp 复制代码
g++ -std=c++23 -fmodules-ts -c exportdemo.cppm

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

在成功编译模块的基础上继续编译.

3.编译所有单元

cpp 复制代码
g++ -std=c++23 -fmodules-ts -o demo exportdemo.cpp main.cpp

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

cpp 复制代码
./demo

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

使用cmake编译

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

cpp 复制代码
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编译:

cpp 复制代码
mkdir build &&cd build
cmake -G Ninja ..

这是原来用g++编译才报得错误啊,想了一下,忽然想到刚刚编译了一个最新cmake4.0,并临时在环境变量里了指定.

会不是是该原因呢 然后查看了一下cmake版本,果然是4.0,重新打开一个终端,再次查看了一下cmake版本,是3.31.6.

重新使用上面的命令编译:

cpp 复制代码
cmake -G Ninja ..

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

相关推荐
David猪大卫2 小时前
【C++修炼】map 和 set 的使用
c语言·开发语言·数据结构·c++·经验分享·笔记·学习
HPtiger2 小时前
C++ 入门笔记:从 C 到 C++ 的核心过渡(命名空间、输入输出、缺省参数、重载、引用、内联)
c语言·c++·学习
努力努力再努力wz5 小时前
【Lua 进阶系列】从 C++ 对象到 Lua 变量:一文理解 userdata、Lua 栈与元表绑定机制
c++·junit·lua
慧都产品智能化6 小时前
Qt 表格升级攻略:复用已有编辑器,减少重复开发
c++·qt·编辑器·qt6.3
ShineWinsu6 小时前
对于Qt:QTableWidget常见属性以及QTableWidgetItem类的解析
开发语言·c++·qt·gui·客户端·表格·qtablewidget
ShineWinsu7 小时前
对于Qt:QListWidget常见属性以及QListWidgetItem类的解析
开发语言·c++·qt·客户端·列表·qlistwidget·qlistwidgetitem
坤坤子吖7 小时前
Linux网络编程:自定义应用层协议与 JSON 序列化
linux·服务器·网络·c++·笔记·json
沫璃染墨9 小时前
从零入门计算机网络系列(十八):TCP连接管理详解——从三次握手与四次挥手到TIME_WAIT机制
运维·服务器·网络·c++·网络协议·tcp/ip·tcp
自信1504130575910 小时前
重生之从0开始学习c++之——vector-中篇
c++·学习·算法
ShineWinsu13 小时前
对于Qt:QDial常见属性以及信号的解析
开发语言·c++·qt·gui·客户端·旋钮·qdial