CMake+Ninja构建LLVM时/manifest:no未生效,mt.exe报错求助
问题原因分析
- LLVM特殊目标的配置覆盖:当启用
LLVM_OPTIMIZED_TABLEGEN=ON时,LLVM会为llvm-tblgen单独生成优化构建规则,这部分规则可能硬编码了链接参数,覆盖了你设置的全局CMAKE_EXE_LINKER_FLAGS。即使build.ninja中显示了/manifest:no,实际执行时也可能被LLVM的自定义CMake逻辑替换。 - CMake的manifest后处理步骤:
/manifest:no仅告知链接器不生成manifest文件,但CMake可能存在独立的后续步骤(比如自动添加系统运行时依赖的manifest),这会触发mt.exe单独处理manifest,和链接器的标志无关。
解决方法
方法一:彻底禁用CMake的manifest处理
在CMake配置命令中添加额外变量,从根源上阻止CMake调用mt.exe:
cmake -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_INSTALL_PREFIX=d:\buildbot-worker\worker\llvm-dev-nvptx-win/install -DLLVM_ENABLE_PROJECTS=llvm -DLLVM_ENABLE_ASSERTIONS=ON -DLLVM_LIT_ARGS=-vv -DLLVM_TARGETS_TO_BUILD=X86;NVPTX -DLLVM_DEFAULT_TARGET_TRIPLE=nvptx-nvidia-cuda -DLLVM_OPTIMIZED_TABLEGEN=ON -DCMAKE_EXE_LINKER_FLAGS=/manifest:no -DCMAKE_MODULE_LINKER_FLAGS=/manifest:no -DCMAKE_SHARED_LINKER_FLAGS=/manifest:no -DCMAKE_WINDOWS_EXPORT_ALL_SYMBOLS=OFF -DCMAKE_INSTALL_UCRT_LIBRARIES=OFF -DCMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP=TRUE -Wno-dev d:\buildbot-worker\worker\llvm-dev-nvptx-win/llvm
方法二:针对llvm-tblgen目标强制设置链接标志
修改LLVM源码中的CMake配置文件,确保llvm-tblgen目标使用/manifest:no:
- 打开
llvm/utils/TableGen/CMakeLists.txt - 在
add_executable(llvm-tblgen ...)语句之后,添加:
target_link_options(llvm-tblgen PRIVATE /MANIFEST:NO)
- 重新运行CMake配置并构建。
方法三:临时规避文件占用问题
如果只是mt.exe因文件被占用报错,可尝试:
- 关闭所有可能占用
llvm-tblgen.exe的进程(比如之前构建残留的后台进程) - 清理build目录后重新执行CMake配置和构建
- 使用单线程构建:
ninja -j1,避免并行构建时的文件竞争
内容的提问来源于stack exchange,提问作者vam
相关产品推荐
相关产品推荐

