如何在独立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
相关产品推荐
相关产品推荐

