使用GCC同时编译C和C++文件

39

我想使用GCC编译C和C++源代码。

gcc -std=c++0x test.cpp -std=c99 test.c -lstdc++

现在,这个方法可以正常工作,但是会有两个警告。

cc1plus: warning: command line option "-std=c99" is valid for C/ObjC but not for C++
cc1: warning: command line option "-std=c++0x" is valid for C++/ObjC++ but not for C

因此,我无法在这种设置下使用-Werror。是否有办法抑制这些警告?


1
你认为自己在做的事情和你实际在做的事情非常不同。你首先将语言标准设置为C++0x,然后将其设置为C99,这相当于只使用C99来编译两个文件。然而,在C99模式下编译C++是不可能的,因此对于.cpp文件,编译器将回退到其默认设置,即C++98。因此,你正在使用C99编译C文件,而使用C++98编译C++文件。在解析选项时,GCC发现你有不兼容的文件与每个语言版本选项,因此它会输出每个选项的警告。 - Damon
7个回答

62

分别编译文件,使用g++链接

gcc -c -std=c99 -o file1.o file1.c
g++ -c -std=c++0x -o file2.o file2.cpp
g++ -o myapp file1.o file2.o

是的,没问题,但我需要在一个GCC调用中编译它。我正在使用一个API来调用GCC,我只能添加标志。 - Šimon Tóth
@Let_Me_Be:那么你需要编写一个脚本/包装器并调用它,或者在不指定C99的情况下将你的c编译为c++。 - Erik
嗯,我可以预编译C++部分(因为那部分不会改变) :-) - Šimon Tóth
1
如果您害怕将来自不同编译器的.o文件链接在一起,可以使用g++ -x c代替gcc - Gabriel Devillers

16

如果其他人想知道在Android中实现此功能的最佳方法,那就是这样做:

LOCAL_CFLAGS := -Werror
LOCAL_CONLYFLAGS := -std=gnu99
LOCAL_CPPFLAGS := -std=c++0x

7

gcc是C语言编译器,g++是C++语言编译器。您正在混合使用两种风格不同的语言。请分别进行编译,然后再进行链接:

gcc -std=c99 -c -o test.c.o test.c
g++ -std=c++0x -c -o test.cpp.o test.cpp
g++ -o executable test.cpp.o test.c.o

1
你的g++编译行需要额外加上一个=和一个-c - Erik
这解决了我的困惑。您能简要解释一下为什么 g++ 不设计成可以编译 c 吗? - VimNing
@VimNing 为什么应该呢?C语言和C++语言是不同的编程语言。 - orlp

2

不要使用gcc,而是使用g++。

这适用于.cpp和.c文件的两种类型。


4
g++ 不会将 C 文件编译为 C++,对吗? - Šimon Tóth
在给出编译指令时,如果你明确指定为 .c,根据我的了解,它可能不会被视为 .cpp。但请与一个确切了解的人确认一下这一点。 - Chaithra
8
使用g++编译的C源代码文件将被编译成C++代码。 - Martin York
1
@LokiAstari 是的,我刚刚用gcc 6.3.0进行了测试。但是可以通过-x c选项强制g++编译为C代码。 - Gabriel Devillers
2
@GabrielDevillers 如果你知道正确的参数,你可以强制编译器做任何事情。如果想要的话,你可以将以“.fart”结尾的文件编译为C文件。但重点在于默认行为(没有标志)略微出人意料。通常,你会期望编译器尊重文件名后缀(或警告你)。但g++不会这样做;它把 *.c*.cpp 都视为C++源文件。这可能会极大地改变它们的含义(正如你所知,C和C++是完全不同的语言)。 - Martin York

2

1

这对于Android NDK非常相关。幸运的是,有一个丑陋的解决方法。为了使所有C文件编译为c99,并将所有CPP文件编译为c++0x,请在Android.mk文件中添加以下行:

LOCAL_CPPFLAGS += -std=c++0x
LOCAL_C99_FILES := $(filter %.c, $(LOCAL_SRC_FILES))
TARGET-process-src-files-tags += $(call add-src-files-target-cflags, $(LOCAL_C99_FILES), -std=c99)

这在最新的NDK r8b版本中与arm-linux-androideabi-4.6工具链一起使用是有效的,但我不能保证它在未来的版本中仍然有效,并且我没有在早期版本中进行测试。


0
尝试将cpp文件包含在c文件中,或者反之,然后使用g++进行编译,我认为gnu会自动将其编译为头文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接