CMake中C++20模块接口单元的标准Unix安装路径咨询
目前GNUInstallDirs确实没有专门为C++模块定义标准化变量,因为C++模块的部署规范还未像头文件、库文件那样形成完全统一的行业标准,但社区和主流工具链已有一些通用实践:
推荐的安装路径方案
方案1:库目录下的隔离子目录
建议将C++模块安装到${CMAKE_INSTALL_LIBDIR}/cxx-modules/${PROJECT_NAME},既遵循GNUInstallDirs的结构,又能避免不同库的模块文件冲突。修改后的配置如下:FILE_SET CXX_MODULES DESTINATION "${CMAKE_INSTALL_LIBDIR}/cxx-modules/${PROJECT_NAME}"这种方式的优势是模块文件与对应库文件放在一起,工具链(如Clang/GCC)查找模块时更容易关联到正确的库,同时不同库的模块不会互相干扰。
方案2:头文件目录下的子目录
若希望模块接口单元与头文件逻辑位置更接近,可选择${CMAKE_INSTALL_INCLUDEDIR}/cxx-modules/${PROJECT_NAME},但需确保工具链能识别该路径为模块搜索路径,可能需要在导出目标时额外配置CMAKE_CXX_MODULE_PATH。
关于"cxx-modules"目录名的合理性
你当前使用的cxx-modules作为目录名是合理的,属于社区广泛接受的命名惯例,不少开源项目(如LLVM工具链相关示例)都采用类似命名。不过直接使用根目录下的cxx-modules可能导致不同库的模块文件混杂,建议加上项目名作为子目录做隔离。
额外配置注意事项
安装后需在导出的目标配置中设置INTERFACE_CXX_MODULE_PATH,确保依赖你的库的项目能找到模块文件:
install(EXPORT mylib-targets FILE mylibTargets.cmake NAMESPACE mylib:: DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/mylib" COMPONENT mylib-development) # 在导出目标中指定模块搜索路径 set_target_properties(mylib PROPERTIES INTERFACE_CXX_MODULE_PATH "${CMAKE_INSTALL_LIBDIR}/cxx-modules/${PROJECT_NAME}")
不同工具链对模块搜索路径的默认规则略有差异,Clang和GCC目前都支持通过-fmodule-search-path指定路径,CMake会通过INTERFACE_CXX_MODULE_PATH自动将该参数传递给依赖项目。
内容的提问来源于stack exchange,提问作者Guillaume Racicot

