【发布时间】: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++ 链接