【问题标题】:Forcing Clang to link with C++ runtime强制 Clang 与 C++ 运行时链接
【发布时间】:2012-10-07 23:45:42
【问题描述】:

我有一个混合了 C 和 C++ 源代码的项目。它目前在 OS X 上使用 GCC 构建。该项目有定制的构建脚本,它们调用 gcc 命令来编译 C 和 C++ 源代码,并分别调用链接器。

我现在正在尝试使用 Clang 构建它。

调用clang 确实可以正确编译源文件;它区分.c.cpp 源文件,并在每种情况下编译为适当的语言。不过,我在链接时遇到问题。当链接器被调用为clang 时,C++ 运行时库没有被链接进来,由于缺少符号而导致构建错误。

当我将clang++ 设置为构建工具时,我可以成功链接,但这会导致编译时错误和警告;它真的不喜欢用 C++ 编译器编译 C 源代码。

clang: warning: treating 'c' input as 'c++' when in C++ mode, this behavior is deprecated
...
/usr/include/stdio.h:250:49: error: redefinition of parameter 'restrict'

我必须为构建脚本指定一个工具以用作编译器/链接器,因此我需要简单地替换 clang 来代替 gcc。 有什么办法可以说服clang(不是clang++)与C++ 运行时库链接?

-stdlib=libc++ 等选项不起作用。

【问题讨论】:

  • 为什么必须提供单一工具?工具链应该能够同时处理 C 和 C++ 编译器
  • 自定义构建脚本太痛苦而无法更改以允许单独的工具。
  • 只是反转关系。创建一个接受参数的“编译”脚本,测试文件是 C 还是 C++,并根据需要调用 clang 或 clang++。更新您的构建脚本以引用该脚本。或者,始终使用 clang++ 链接

标签: c++ c macos linker clang


【解决方案1】:

您应该能够使用普通的链接器标志,就像您对 gcc 所做的一样:clang -lc++clang -lstdc++,具体取决于您想要的实现。 (你应该想要 libc++)

【讨论】:

  • @H2CO3 -lc++ 用于 libc++,-lstdc++ 用于 libstdc++。
  • 嗯,就是这么简单。在编译器模式下使用该工具时,我收到有关 -lc++ 标志被忽略的警告,但我可以忍受。谢谢!
  • 在 VS 2019 Android 版本中,-lm 和 -lc++ 都为我修复了 ARM32 和 ARM64 版本。认为 VS 中有一个错误导致我来到这里。
猜你喜欢
  • 2017-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-11
  • 1970-01-01
  • 2013-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多