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

如何在独立CMake项目中调用C++20模块库导出的类

在独立CMake项目中使用C++20模块库

我有一个使用实验性C++20模块创建的库,该库导出一个类,其CMake配置如下:

cmake_minimum_required(VERSION 3.26)

set(CMAKE_EXPORT_COMPILE_COMMANDS YES)

project(TestLib CXX)

list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

if(CMAKE_VERSION VERSION_LESS "3.27.0")
    set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API "2182bf5c-ef0d-489a-91da-49dbc3090d2a")
else()
    set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API "aa1f7df0-828a-4fcd-9afc-2dc80491aca7")
endif()

set(CMAKE_EXPERIMENTAL_CXX_MODULE_DYNDEP 1)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_SCAN_FOR_MODULES YES)

set(TESTLIB_SOURCE_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/src")

add_library(TestLib)
target_sources(TestLib PUBLIC FILE_SET cxx_modules TYPE CXX_MODULES FILES
    "${TESTLIB_SOURCE_DIRECTORY}/module.ixx"
)

请问如何在另一个非子文件夹嵌套的CMake项目中,使用该编译库中模块导出的类?


解决方案

步骤1:为TestLib添加安装规则

要让外部项目能找到并使用TestLib,需在TestLib的CMakeLists.txt末尾补充安装配置,将库文件、模块元数据和CMake配置文件安装到指定目录:

# 安装库文件
install(TARGETS TestLib
    EXPORT TestLibTargets
    LIBRARY DESTINATION lib
    ARCHIVE DESTINATION lib
    RUNTIME DESTINATION bin
    INCLUDES DESTINATION include
)

# 安装C++模块文件集
install(FILE_SET cxx_modules
    DESTINATION include/cxx_modules
)

# 导出目标配置
install(EXPORT TestLibTargets
    FILE TestLibTargets.cmake
    NAMESPACE TestLib::
    DESTINATION lib/cmake/TestLib
)

# 生成并安装版本与配置文件
include(CMakePackageConfigHelpers)
write_basic_package_version_file(
    "${CMAKE_CURRENT_BINARY_DIR}/TestLibConfigVersion.cmake"
    VERSION 1.0.0
    COMPATIBILITY SameMajorVersion
)

configure_package_config_file(
    "${CMAKE_CURRENT_SOURCE_DIR}/cmake/TestLibConfig.cmake.in"
    "${CMAKE_CURRENT_BINARY_DIR}/TestLibConfig.cmake"
    INSTALL_DESTINATION lib/cmake/TestLib
)

install(FILES
    "${CMAKE_CURRENT_BINARY_DIR}/TestLibConfig.cmake"
    "${CMAKE_CURRENT_BINARY_DIR}/TestLibConfigVersion.cmake"
    DESTINATION lib/cmake/TestLib
)

同时在TestLib项目的cmake目录下创建TestLibConfig.cmake.in文件,内容如下:

@PACKAGE_INIT@

include("${CMAKE_CURRENT_LIST_DIR}/TestLibTargets.cmake")
check_required_components(TestLib)

完成配置后编译并安装TestLib:

mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/path/to/install/dir  # 可指定自定义路径,如/usr/local
cmake --build .
cmake --install .

步骤2:在外部项目中引入TestLib

在外部项目的CMakeLists.txt中配置C++20模块支持,通过find_package定位TestLib并链接到目标:

cmake_minimum_required(VERSION 3.26)

project(MyApp CXX)

# 保持与TestLib一致的C++模块API配置
if(CMAKE_VERSION VERSION_LESS "3.27.0")
    set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API "2182bf5c-ef0d-489a-91da-49dbc3090d2a")
else()
    set(CMAKE_EXPERIMENTAL_CXX_MODULE_CMAKE_API "aa1f7df0-828a-4fcd-9afc-2dc80491aca7")
endif()

set(CMAKE_EXPERIMENTAL_CXX_MODULE_DYNDEP 1)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_SCAN_FOR_MODULES YES)

# 若TestLib安装在非系统默认目录,需指定路径
# set(CMAKE_PREFIX_PATH "/path/to/install/dir")

# 查找TestLib
find_package(TestLib 1.0.0 REQUIRED)

# 创建可执行目标并链接TestLib
add_executable(MyApp src/main.cpp)
target_link_libraries(MyApp PRIVATE TestLib::TestLib)

步骤3:在代码中使用模块

在外部项目的main.cpp中直接导入模块即可使用库中导出的类:

import TestLib;  // 对应module.ixx中导出的模块名

int main() {
    TestLib::MyClass obj;
    obj.doSomething();
    return 0;
}

内容的提问来源于stack exchange,提问作者keith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 07:35:26