假设我有一个由C和C++代码组成的代码库,如下所示:
TC:
int derp(void)
{
return 42;
}
Run Code Online (Sandbox Code Playgroud)
t.cpp:
#include <iostream>
extern "C" int derp(void);
int main(void)
{
std::cout << derp() << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用clang(++),我可以一次编译它们,就像这样:
clang++ -o t -xc++ t.cpp -xc t.c
Run Code Online (Sandbox Code Playgroud)
但是,如果我现在想要使用非标准功能,gnu++14并调用编译器,如下所示:
clang++ -o t -xc++ -std=gnu++14 t.cpp -xc t.c
Run Code Online (Sandbox Code Playgroud)
我遇到了一个错误:
error: invalid argument '-std=gnu++14' not allowed with 'C/ObjC'
Run Code Online (Sandbox Code Playgroud)
不像-x,-std似乎不是基于文件级别工作,而是作为一个全局选项,因为-std=c11像这样添加:
clang++ -o t -xc++ -std=gnu++14 t.cpp -xc -std=c11 t.c
Run Code Online (Sandbox Code Playgroud)
简单地告诉我"反向"错误,可以这么说:
error: invalid argument '-std=c11' not allowed with 'C++/ObjC++'
Run Code Online (Sandbox Code Playgroud)
而且我知道我可以将每个源文件.o分别编译成一个文件并在之后将它们链接在一起(是的,无论如何我都在自动完成整个过程),但我不禁认为用每种语言编写不同的标准应该是可能的.毕竟,clang支持一起编译不同语言的文件,在这样做时,它们是否已经需要单独的标准值?
那么,有没有一种方法可以在编译C和C++代码时使用clang(++)手动指定标准?
你可以编译C,也可以编译C++。
不能同时编译为 C 和 C++。
使用适合 C 的标志编译 C 源文件。
然后使用适合 C++ 的标志(例如 )编译 C++ 源文件-std=gnu14。
然后将结果链接在一起以获得可执行文件。
clang -o a.o t.c
clang++ -o b.o t.cpp -std=gnu++14
clang++ -o t a.o b.o
Run Code Online (Sandbox Code Playgroud)
您无法使用尝试同时执行这两项操作的速记方式。它被设计为当所有标志和所有内容都相同时的快捷方式。-x尽管它具有让你接近的魔力。
| 归档时间: |
|
| 查看次数: |
662 次 |
| 最近记录: |