Windows上的Clang + LLVM静态库链接错误 - 为什么符号会有所不同?

时间:2014-05-17 11:51:03

标签: windows visual-studio visual-c++ linker-errors llvm-clang

按照llvm网站上的说明编译clang和llvm之后,我尝试链接到测试应用程序中构建的静态库。所有代码都是使用VS工具集的v110构建的。我得到类型为&#34的链接器错误;错误LNK2001"和"错误LNK2019"。

应用程序似乎将lib放入存储桶中以进行符号解析。使用详细的链接器输出,我可以看到它们只是被解雇了:

1>未使用的库: ... 1 GT; C:\ SDK \ LLVM \调试\ LIB \ clangTooling.lib ...

深入挖掘我发现错误信息中的符号和库中的符号并不完全相同。

- 这是一个例子 -

链接器错误=>

*未解析的外部符号" public:int __cdecl clang :: tooling :: ClangTool :: run(class clang :: tooling :: ToolAction )" (?运行@ ClangTool @ tooling @ clang @@ QEAAHPEAVToolAction @ 23 @@ Z)在函数main中引用

...给" ?run @ ClangTool @ tooling @ clang @@ QEAAHPEAVToolAction @ 23 @@ Z "作为符号名称。

现在使用" dumpbin / SYMBOLS"在我的构建版本的clangTooling.lib =>

* FDA 00000000 UNDEF notype()外部| ?run @ ClangTool @ tooling @ clang @@ QAEHPAVToolAction @ 23 @@ Z(public:int __thiscall clang :: tooling :: ClangTool :: run(class clang :: tooling :: ToolAction )) < /强>

...我可以看到正在寻找的符号被调用 &#34;的 运行@ ClangTool @工装@ @@铛@ QAEHPAVToolAction 23 @@ž &#34;

地址开头附近有一个非常微妙的区别。在这里他们再次并排进行比较。

?run @ ClangTool @ tooling @ clang @@ QEAAHPEAVToolAction @ 23 @@ Z&lt;&lt;错误消息

?run @ ClangTool @ tooling @ clang @@ QAEHPAVToolAction @ 23 @@ Z&lt;&lt;转储输出

为什么这些不匹配?

由于

1 个答案:

答案 0 :(得分:3)

所以事实证明我构建的LLVM / clang库是32位,而我的测试项目是64位。我使用32位二进制文​​件成功构建了一个测试项目。这个答案的注释Unresolved Externals in C++: Visual C++ mangles method signature differently from mangled method in dll更详细地描述了这个问题。

*请注意其他任何想要链接LLVM库的人。 LLVM / clang的CMake文档(在此处http://llvm.org/docs/CMake.html)使其听起来像在64位系统上默认为64位。在Windows7 64bit / VisualStudio11上(至少在我的机器上),情况并非如此。我还没有找到一个从CMake菜单支持64位编译的选项。目前似乎唯一的选择是嵌入32位应用程序。