求基于C++20模块、GCC13及CMake的Linux共享库分发示例代码
基于C++20模块、GCC13和CMake的Linux共享库分发示例
一、库项目结构
mylib/ ├── include/ │ └── mylib.cppm # 模块接口文件 ├── src/ │ └── mylib_impl.cpp # 模块实现文件 ├── CMakeLists.txt └── Config.cmake.in
二、库端CMake配置
CMakeLists.txt
cmake_minimum_required(VERSION 3.28) project(mylib LANGUAGES CXX) # 启用C++20标准及模块支持 set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # GCC13模块编译必需选项 add_compile_options(-fmodules-ts) # 创建共享库 add_library(mylib SHARED) # 添加模块接口文件(标记为CXX_MODULES类型) target_sources(mylib PUBLIC FILE_SET CXX_MODULES FILES include/mylib.cppm ) # 添加模块实现代码 target_sources(mylib PRIVATE src/mylib_impl.cpp ) # 设置包含目录,确保用户侧能访问模块接口文件 target_include_directories(mylib PUBLIC $<INSTALL_INTERFACE:include> $<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include> ) # 安装规则:分发.so库和模块接口文件 install(TARGETS mylib LIBRARY DESTINATION lib FILE_SET CXX_MODULES DESTINATION include ) # 导出库配置,方便用户侧通过find_package调用 install(EXPORT mylibTargets FILE mylibTargets.cmake DESTINATION lib/cmake/mylib ) include(CMakePackageConfigHelpers) configure_package_config_file( "${PROJECT_SOURCE_DIR}/Config.cmake.in" "${PROJECT_BINARY_DIR}/mylibConfig.cmake" INSTALL_DESTINATION lib/cmake/mylib ) install(FILES "${PROJECT_BINARY_DIR}/mylibConfig.cmake" DESTINATION lib/cmake/mylib )
Config.cmake.in
@PACKAGE_INIT@ include("${CMAKE_CURRENT_LIST_DIR}/mylibTargets.cmake") check_required_components(mylib)
三、库的模块代码
模块接口文件(include/mylib.cppm)
export module mylib; export namespace mylib { int add(int a, int b); class Calculator { public: int multiply(int x, int y); }; }
模块实现文件(src/mylib_impl.cpp)
import mylib; namespace mylib { int add(int a, int b) { return a + b; } int Calculator::multiply(int x, int y) { return x * y; } }
四、用户侧使用示例
用户项目结构
myapp/ ├── src/ │ └── main.cpp └── CMakeLists.txt
用户侧CMake配置
cmake_minimum_required(VERSION 3.28) project(myapp LANGUAGES CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # 启用GCC模块支持 add_compile_options(-fmodules-ts) # 查找已安装的mylib库 find_package(mylib REQUIRED) # 创建可执行文件并链接库 add_executable(myapp src/main.cpp) target_link_libraries(myapp PRIVATE mylib)
用户源码(src/main.cpp)
import mylib; #include <iostream> int main() { std::cout << "3 + 5 = " << mylib::add(3, 5) << std::endl; mylib::Calculator calc; std::cout << "4 * 6 = " << calc.multiply(4, 6) << std::endl; return 0; }
五、关键注意事项
- 编译器版本一致性:用户必须使用GCC13或兼容版本,C++模块的二进制格式与编译器厂商、版本强绑定,跨版本无法兼容。
- 模块接口文件分发:必须将
.cppm接口文件与.so库一同发布,用户侧需要编译这些接口文件生成本地模块元数据。 - CMake版本要求:必须使用CMake 3.28及以上版本,该版本对C++20模块的
FILE_SET机制支持更完善。 - 编译选项:无论库端还是用户侧,都需要添加
-fmodules-ts选项启用GCC的模块支持。
内容的提问来源于stack exchange,提问作者S. Gleissner
相关产品推荐
相关产品推荐

