在Windows环境下使用MSYS2 CLANG64二进制文件加载并运行自定义Clang插件失败
我之前在MSYS2的CLANG64环境折腾自定义Clang插件时,也碰到过一模一样的“找不到插件”问题,大概率是编译参数、环境匹配或者加载命令的细节没做对,给你列几个排查和解决的关键点:
1. 确保插件编译参数和CLANG64的clang完全对齐
这是最容易踩的坑,因为CLANG64的clang是**默认链接libc++**的,你的插件如果编译时没对齐这个设置,直接就会加载失败:
- 编译插件时必须指定
-stdlib=libc++,强制用和clang一致的标准库 - 要加
-shared参数生成DLL格式的插件(Windows下Clang插件以DLL形式存在),同时加上-fPIC(MinGW CLANG64环境下这个参数也需要,确保代码位置无关) - 链接时要指定CLANG64包里的Clang开发库,比如
-lclangFrontend -lclangAST -lclangCompilerInstance -lclangRecursiveASTVisitor,别混用其他版本的Clang库
参考编译命令示例:
clang++ -stdlib=libc++ -shared -fPIC MyPlugin.cpp -o MyPlugin.dll -lclangFrontend -lclangAST -lclangCompilerInstance -lclangRecursiveASTVisitor
2. 加载插件的命令要符合CLANG64环境的要求
别用普通CMD的Windows路径,一定要打开CLANG64的专属终端,用POSIX风格的路径,而且必须用-Xclang把参数传给Clang前端:
clang -Xclang -load -Xclang ./MyPlugin.dll -Xclang -add-plugin -Xclang my-plugin test.cpp
这里的my-plugin是你在FrontendPluginRegistry::Add里注册的插件名字,要完全对应上,比如你代码里如果写的是static FrontendPluginRegistry::Add<MyPlugin> X("my-plugin", "My test plugin");,那这里就必须写my-plugin
3. 排查插件的依赖问题
用CLANG64终端里的ldd命令检查插件的依赖,看看有没有缺失的库或者版本不匹配的情况:
ldd MyPlugin.dll
如果输出里有not found的libc++或者Clang相关DLL,说明你的编译环境没拉对,或者环境变量没设置好——CLANG64终端默认会把所有依赖库的路径加到PATH里,所以一定要在CLANG64的终端里完成编译和加载操作,别用普通CMD或者其他MSYS2子系统(比如MINGW64)的终端
4. 确认插件的代码框架没问题
你贴的代码开头是完全符合Clang插件的基本结构的,只要后面的ASTConsumer和RecursiveASTVisitor实现没有语法错误,编译出来的插件本身逻辑是没问题的,所以重点还是放在前面的编译和加载环节排查
备注:内容来源于stack exchange,提问作者cose

