假设我有一个由C和C++代码组成的代码库,如下所示:
t.c:
我知道我可以将每个源文件单独编译成
因此,是否有一种方法可以在使用clang(++)编译C和C++代码时手动指定标准?
t.c:
int derp(void)
{
return 42;
}
t.cpp:
#include <iostream>
extern "C" int derp(void);
int main(void)
{
std::cout << derp() << std::endl;
return 0;
}
使用clang(++),我可以像下面这样将它们一起编译:
clang++ -o t -xc++ t.cpp -xc t.c
然而,如果我现在想要使用如gnu++14
等非标准特性,并像这样调用编译器:
clang++ -o t -xc++ -std=gnu++14 t.cpp -xc t.c
我收到了一个错误提示:
error: invalid argument '-std=gnu++14' not allowed with 'C/ObjC'
与-x
不同,-std
似乎不是基于文件级别工作的,而是全局选项,因为添加-std=c11
会产生如下效果:
clang++ -o t -xc++ -std=gnu++14 t.cpp -xc -std=c11 t.c
只是给我一个“相反”的错误:
error: invalid argument '-std=c11' not allowed with 'C++/ObjC++'
我知道我可以将每个源文件单独编译成
.o
文件,然后再链接它们在一起(是的,我无论如何都在自动化整个过程),但我不禁想到应该可以使用不同的语言标准进行编译。毕竟,clang支持同时编译不同语言的文件,并且在这样做时需要分别为标准指定单独的值,不是吗?因此,是否有一种方法可以在使用clang(++)编译C和C++代码时手动指定标准?
cmake_minimum_required(VERSION 3.11) project(t) set(CMAKE_CXX_STANDARD 14) set(CMAKE_C_STANDARD 11) add_executable(t t.cpp t.c)
- Daniel Scheplerclang t.c t.cpp
,结果将是可执行文件命名为t
。默认的C标准是gnu17
,默认的C++标准是gnu++14
。 如果您需要例如c++17,则需要分别编译它们,然后链接它们。就像@Lightness Races in Orbit下面的回答中建议的那样。 - Chef Gladiator