0

我想为 CLANG/LLVM 运行一个示例插件。具体来说llvm\tools\clang\examples\PrintFunctionNames。我设法构建了它,我看到了,PrintFunctionNames.exports但我认为视觉工作室不支持它。该文件很简单_ZN4llvm8Registry*。我不知道那是什么,但我怀疑它的命名空间 llvm,类 Registry 定义为

template <typename T, typename U = RegistryTraits<T> >
class Registry {

我怀疑关键行在示例文件的末尾

static FrontendPluginRegistry::Add<PrintFunctionNamesAction> X("print-fns", "print function names");

print-fns 是名称,而第二个参数是 desc。当我尝试通过加载/运行 dll

clang -cc1 -load printFunctionNames.dll -plugin print-fns a.c

我收到一个关于找不到的错误print-fns。我怀疑它是因为静态变量永远不会被初始化,因此它永远不会注册插件。错误的 dll 名称会在加载模块消息时出错。

我创建了一个 def 文件并将其添加到我的项目中。它编译但仍然没有运气。这是我的def文件

LIBRARY printFunctionNames
EXPORTS
X DATA

我如何注册插件或让这个例子工作?

4

2 回答 2

1

好的,变得稍微清楚一点。总结一下:Visual Studio 与它无关,真的。这是 clang 可执行文件的插件。因此,它们之间必须有一种方法进行通信(插件接口)。这似乎是一个未记录的接口,所以它需要一点猜测。

Troubleshooting DLL issues is done with "Dependency Walker" aka "Depends". It offers a profiling mode, in which all symbol lookups can be profiled. I.e. if you profile clang -cc1 -load printFunctionNames.dll -plugin print-fns a.c, you will see what symbols clang expects from your DLL, and in what order.

于 2011-06-16T11:26:27.557 回答
0

看起来您正在尝试混合使用两种不同的、不兼容的编译器构建的 C++ 代码。这不受支持,您看到的错误是一个典型的迹象:C++ 编译器通常使用“名称修饰方案”,如果两个编译器不兼容,则它们的名称修饰方案不会对齐。一个编译器可能会混淆llvm::Registry_ZN4llvm8Registry*而另一个编译器将其称为llvm__Registry.

于 2011-06-16T09:52:28.747 回答