【发布时间】:2014-05-17 11:51:02
【问题描述】:
按照 llvm 网站上的说明编译 clang 和 llvm 后,我尝试链接到测试应用程序中构建的静态库。所有代码均使用 VS 工具集的 v110 构建。我收到类型为“error LNK2001”和“error LNK2019”的链接器错误。
该应用似乎将库放入存储桶中以进行符号解析。通过详细的链接器输出,我可以看到它们只是被解雇了:
1> 未使用的库: ... 1> C:\Sdk\llvm\Debug\lib\clangTooling.lib ...
深入挖掘我发现错误消息中的符号和库中的符号并不完全相同。
-这是一个例子-
链接器错误 =>
*未解析的外部符号“public: int __cdecl clang::tooling::ClangTool::run(class clang::tooling::ToolAction )” (?run@ClangTool@tooling@clang@@ QEAAHPEAVToolAction@23@@Z) 在 main 函数中引用
...给出“?run@ClangTool@tooling@clang@@QEAAHPEAVToolAction@23@@Z”作为符号名称。
现在在我构建的 clangTooling.lib 版本上使用“dumpbin /SYMBOLS” =>
*FDA 00000000 UNDEF notype () 外部 | ?run@ClangTool@tooling@clang@@QAEHPAVToolAction@23@@Z (public: int __thiscall clang::tooling::ClangTool::run(class clang::tooling::ToolAction ))
...我可以看到我正在寻找的符号被称为 "?run@ClangTool@tooling@clang@@QAEHPAVToolAction@23@@Z"
地址开头附近有一个非常细微的差异。在这里他们再次并排进行比较。
?run@ClangTool@tooling@clang@@QEAAHPEAVToolAction@23@@Z
?run@ClangTool@tooling@clang@@QAEHPAVToolAction@23@@Z
为什么这些不匹配?
谢谢
【问题讨论】:
-
这实际上看起来很相似。 stackoverflow.com/questions/15368791/… 指向 32 位和 64 不兼容。我检查了VC版本,它们是相同的。不确定 LLVM 库是否编译为 64 位(CMake 说它是默认的)
标签: windows visual-studio visual-c++ linker-errors llvm-clang