【问题标题】:Clang+LLVM static library linking error on Windows - Why would the symbols be different?Windows 上的 Clang+LLVM 静态库链接错误 - 为什么符号会不同?
【发布时间】: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


【解决方案1】:

事实证明,我构建的 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 位应用程序中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-24
    • 2019-03-03
    • 2011-09-05
    • 2019-01-16
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多