编写一个模块并调用
看一下自定义模块的代码:
//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.o和gcm目录.
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.ixx或exportdemo.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的问题.执行编译后的可执行文件,可渲染与直接编译相同结果.