使用`import std`时CMake在错误目录查找`std.cppm`的问题
问题:CMake无法定位libc++标准模块接口文件
背景
近期尝试对自有库做模块化改造,但未成功。相关的CMakeLists.txt和CMakePresets.json可查看仓库kissra。核心问题是CMake找不到标准std.cppm主模块接口(PMI)——它错误地去/lib/share/libc++/v1目录查找,而LLVM工具集实际安装路径是/usr/lib/llvm-21/。目前还没找到强制CMake在指定目录搜索PMIs的方法。
错误日志
-- Configuring done (7.1s)
CMake Error at build/debug/CMakeFiles/4.2.1/CMakeCXXCompiler.cmake:111 (target_sources):
Cannot find source file: /lib/share/libc++/v1/std.cppm
Call Stack (most recent call first):
CMakeLists.txt:8 (project)
生成的CMake脚本内容
查看build目录下生成的CMakeCXXCompiler.cmake,内容如下:
### Imported target for C++26 standard library if (NOT TARGET "__CMAKE::CXX26") if (NOT TARGET "__cmake_cxx26") add_library(__cmake_cxx26 STATIC) target_sources(__cmake_cxx26 INTERFACE "$<$<STREQUAL:$<TARGET_PROPERTY:TYPE>,STATIC_LIBRARY>:$<TARGET_OBJECTS:__cmake_cxx26>>") set_property(TARGET __cmake_cxx26 PROPERTY EXCLUDE_FROM_ALL 1) set_property(TARGET __cmake_cxx26 PROPERTY CXX_SCAN_FOR_MODULES 1) set_property(TARGET __cmake_cxx26 PROPERTY CXX_MODULE_STD 0) target_compile_features(__cmake_cxx26 PUBLIC cxx_std_26) target_compile_options(__cmake_cxx26 PRIVATE -Wno-reserved-module-identifier) target_include_directories(__cmake_cxx26 PRIVATE "/lib/x86_64-linux-gnu/../share/libc++/v1") target_sources(__cmake_cxx26 PUBLIC FILE_SET std TYPE CXX_MODULES BASE_DIRS "/lib/x86_64-linux-gnu/../share/libc++/v1" FILES "/lib/x86_64-linux-gnu/../share/libc++/v1/std.cppm" "/lib/x86_64-linux-gnu/../share/libc++/v1/std.compat.cppm") endif () add_library(__CMAKE::CXX26 ALIAS __cmake_cxx26) endif () if (TARGET "__CMAKE::CXX26") list(APPEND CMAKE_CXX_COMPILER_IMPORT_STD "26") endif ()
疑问
从脚本可见CMake正尝试在/lib/share/libc++/v1中查找PMIs,请问能否通过在CMakePreset.json中设置全局CMake变量来指定PMIs的查找路径?
内容的提问来源于stack exchange,提问作者Dmitry Katkevich
相关产品推荐
相关产品推荐

