You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 20:20:25