铿锵声“你好,世界!” windows中的链接错误

Posted

技术标签:

【中文标题】铿锵声“你好,世界!” windows中的链接错误【英文标题】:clang "hello, world!" link errors in windows 【发布时间】:2012-01-01 22:08:40 【问题描述】:

我刚刚下载了 CLang 源代码,使用 CMake 创建了一个 Visual C++ 10 IDE 工作区,并从 Visual C++ 10.0 (express) 构建了所有内容。

现在我在 hello world 上收到一堆链接器错误:

d:\dev\test> 输入 con >foo.cpp #include 使用命名空间标准; int main() cout clang++ foo.cpp foo-839435.o:错误 LNK2019:未解析的外部符号 __ZSt4cout 在函数 _main 中引用 foo-839435.o : 错误 LNK2019: 函数 __ZNSt14error_categoryD0Ev 中引用的未解析的外部符号 __ZdlPv foo-839435.o : 错误 LNK2019: 函数 __ZNSo6sentry 中引用的未解析的外部符号 __ZSt18uncaught_exceptionv D2Ev foo-839435.o:错误 LNK2019:未解析的外部符号 ___cxa_rethrow 在函数 __ZNSt8ios_base5clearEib 中引用 foo-839435.o:错误 LNK2019:函数 __ZNSt8ios_base5clearEib 中引用的未解析的外部符号 ___cxa_allocate_exception foo-839435.o:错误 LNK2019:函数 __ZNSt8ios_base5clearEib 中引用的未解析的外部符号 ___cxa_throw foo-839435.o:错误 LNK2019:函数 __ZSt15make_er 中引用的未解析的外部符号 __ZSt17iostream_categoryv

那我该怎么办呢?

【问题讨论】:

【参考方案1】:

如果您想在 Windows 上试验 Clang,我建议使用 MinGW 构建版本,就像我在此处提供的版本(或使用您最喜欢的 MinGW 工具链自行构建):

32-bit

64-bit

您将需要 gccclang 软件包(没有 linux/mac/cygwin 后缀的软件包)并将它们解压缩到同一目录。 Clang 使用 gcc 链接,并且可以链接到 GCC 的 libstdc++,几乎可以让您访问 C++ 标准库。例外适用于 32 位版本。不过,我对调试信息没有任何运气。

正在努力为 Clang 带来更好的 MS 支持,但这是一项进展缓慢的任务。

【讨论】:

我认为这是“解决方案”,除了您提供的有关异常的信息意味着更好的解决方案是不安装该东西(还)。还是谢谢。 这并不能解决使用 VC 编译的 clang 的问题。使用 MinGW 只是把问题放在一边。不幸的是 libc (libcxx.llvm.org) 不支持 Windows 平台,这是真正的问题。 @Archie: libcxx 可以在 Windows 上使用 MinGW-w64 构建的 Clang 构建(我负责处理),但这并不能满足您的所有需求,例如异常处理、低级运行时函数等等...这里有两个方面:1)让 Clang 像 MSVC++ 一样进行破坏,同时生成相同的 rtti 和异常处理代码,以及 2)使 Clang 镜像 GCC 并链接到它的库,我做了并且它有效对于 32 位。使 MSVC 构建的 Clang 工作将需要 LLVM 对 MSVC 样式代码生成的认真支持,而这目前还不存在。【参考方案2】:

我觉得这里有误会。

Clang 正在(慢慢地)被教导如何解析 MFC 标头。据我所知,François Pichet 是这个项目的一个人,但整个标头文件中只有几个错误(!),很明显,VC++ 解析附带的标准库很久以前就完成了。

但是,这是关于 AST 生成,而不是代码生成。 Clang 当前无法正确生成代码以与 VC++ 库进行交互。不仅名称修改不完整,而且 ABI 仍在塑造中(在过去 2 个月中,为了获得正确的填充/对齐,已经进行了许多补丁),并且存在长期存在的异常问题。

如果您想在 Windows 上使用 Clang,您应该使用 MinGW 或 MinGW64,请参阅 ruben 的回答。

【讨论】:

【参考方案3】:

与 MinGW gcc 不同,clang 不包含 glibc 库,因此默认情况下,它没有标准库或任何其他库。我不知道如何使用 Visual C++ 标准库,但是从您发布的内容中可以清楚地看出,默认情况下它会生成 gcc 之类的符号,因此您需要将其与 glibc 或 newlib 一起使用...

您可以使用-Ldirectory 指定.lib 文件的库路径(或.a 用于glibc),或者将它们放入默认的clang 搜索路径之一(运行:clang -v -x c++ -fsyntax-only some file 以查看它们。)

【讨论】:

MinGW 不包含 glibc,缺少系统 C 库也不是这里的问题。【参考方案4】:

仅使用 clang++ 编译 .cpp,然后尝试使用 ld 链接器代替 MS 链接。对我有用。

【讨论】:

【参考方案5】:

Clang/LLVM 对 Windows 的支持仍然不完美。尝试包含此选项:-Xclang -cxx-abi -Xclang microsoft。但是,我不确定它是否能正常工作。

【讨论】:

谢谢,但我遇到了 ICE(内部编译器错误)。不知道那是ICE。编译器刚刚通过调用 abort() 崩溃了。并告诉我它“还不能破坏构造函数!” UNREACHABLE 在 D:\dev\tools\llvm\tools\clang\lib\AST\MicrosoftMangle.cpp:1172 执行! clang++:错误:clang 前端命令失败,退出代码为 3(使用 -v 查看调用)"

以上是关于铿锵声“你好,世界!” windows中的链接错误的主要内容,如果未能解决你的问题,请参考以下文章

铿锵声、openMP 和 CMake

我如何让铿锵声转储没有颜色的 AST?

如何从GCC /铿锵声组件输出中消除“噪音”?

_mm_cvtsi64x_si128 的铿锵声支持

conflict , clash ,collision 表示冲突、矛盾的时候有啥区别?

你好 世界