Windows构建SkeletonPass遇“Loadable modules不支持”问题求助
Windows平台构建LLVM Pass出现"Loadable modules not supported"的原因与解决方法
错误原因解析
SkeletonPass ignored -- Loadable modules not supported on this platform.
这个提示的核心问题是:LLVM在Windows平台(尤其是搭配MSVC编译的LLVM)默认不支持动态加载Pass插件。Linux上的.so动态插件机制在Windows上的实现存在限制,LLVM的AddLLVM.cmake脚本会检测平台与编译环境,当识别到Windows+MSVC组合时,会跳过动态插件的构建流程。
另外,Looking for os_signpost_interval_begin - not found是macOS专属的性能分析API,Windows下不存在属于正常警告,完全不影响核心功能,可直接忽略。
解决方法
方法一:静态链接Pass到LLVM工具(推荐,无需重新编译LLVM)
如果不想重新编译LLVM,可以将Pass编译为静态库,直接链接到opt或自定义LLVM工具中:
- 修改
skeleton/CMakeLists.txt,替换原有的add_llvm_pass_plugin逻辑:
add_library(SkeletonPass STATIC Skeleton.cpp) target_link_libraries(SkeletonPass PRIVATE LLVMIRReader LLVMCore LLVMAsmParser)
- 在根目录
CMakeLists.txt中添加静态库与opt的链接逻辑:
# 定位LLVM的opt工具目标 get_target_property(OPT_EXECUTABLE opt LOCATION) # 将Pass静态库链接到opt target_link_libraries(opt PRIVATE SkeletonPass)
完成后编译,Pass会被直接集成到opt中,无需动态加载。
方法二:重新编译LLVM以支持Windows动态插件
如果必须使用动态插件(.dll形式加载),需要用Clang编译LLVM并开启插件支持:
- 下载LLVM源码,在构建目录执行CMake时添加以下关键选项:
cmake -G "Visual Studio 17 2022" -T ClangCL ^ -DLLVM_ENABLE_PLUGINS=ON ^ -DLLVM_BUILD_SHARED_LIBS=OFF ^ -DLLVM_TARGETS_TO_BUILD=X86 ^ ../llvm
ClangCL作为工具链:MSVC对LLVM插件机制支持有限,Clang是更适配的选择LLVM_ENABLE_PLUGINS=ON:强制开启插件支持LLVM_BUILD_SHARED_LIBS=OFF:编译静态LLVM库(动态库下插件支持逻辑更复杂)
- 完成LLVM编译后,回到你的Pass项目重新执行CMake,此时
add_llvm_pass_plugin会生成.dll格式的动态插件,原错误提示会消失。 - 加载插件时使用命令:
opt -load-plugin SkeletonPass.dll(LLVM 14+版本支持,旧版本用-load参数)
内容的提问来源于stack exchange,提问作者EUV
相关产品推荐
相关产品推荐

