DLL导出/初始化问题(静态变量初始化?)Visual Studio C ++

时间:2011-06-16 06:30:10

标签: c++ visual-c++ clang static-variables dllexport

我想为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

如何注册插件或让此示例正常工作?

2 个答案:

答案 0 :(得分:1)

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

使用“Dependency Walker”(即“取决于”)来解决DLL问题。它提供了一种分析模式,可以对所有符号查找进行分析。即如果您对clang -cc1 -load printFunctionNames.dll -plugin print-fns a.c进行了分析,则会看到您的DLL期望的符号clang以及按什么顺序排列。

答案 1 :(得分:0)

看起来您正试图混合使用两个不同的,不兼容的编译器构建的C ++代码。这不受支持,你看到的错误就是一个典型的迹象:C ++编译器通常使用&#34;名称修改方案&#34;,如果两个编译器不兼容,那么他​​们的名字会破坏计划不排队。一个编译器可能将llvm::Registry变为_ZN4llvm8Registry*,而另一个编译器将其称为llvm__Registry