按照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;转储输出
为什么这些不匹配?
由于
答案 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位应用程序。