使用 GCC 一起编译 C 和 C++ 文件

Posted

技术标签:

【中文标题】使用 GCC 一起编译 C 和 C++ 文件【英文标题】:Compiling C and C++ files together using GCC 【发布时间】:2011-03-25 09:34:15 【问题描述】:

我正在尝试使用 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。能否以某种方式抑制这些警告?

【问题讨论】:

认为你正在做的与你正在做的有很大的不同。您首先将语言标准设置为 C++0x,然后将其设置为 C99,这相当于仅对 both 文件使用 C99。但是,在 C99 模式下编译 C++ 是不可能的,因此对于 .cpp 文件,编译器将回退到其默认值,即 C++98。因此,您在 C99 中编译 C 文件,在 C++98 中编译 C++ 文件。在解析选项时,GCC 会发现您的任一语言版本选项都有不兼容的文件,因此它会为每个选项输出警告。 【参考方案1】:

分别编译文件,用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,我只能添加标志。 @Let_Me_Be:然后你需要编写一个脚本/包装器并调用它,或者在不指定 C99 的情况下将你的 c 编译为 c++ 嗯,我实际上可以预编译 C++ 部分(因为这不会改变):-) 如果你害怕将不同编译器的.o链接在一起,你可以使用g++ -x c而不是gcc【参考方案2】:

如果其他人想知道在 android 中执行此操作的最佳方式,那就是:

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

【讨论】:

【参考方案3】:

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

【讨论】:

您的 g++ 编译行中需要一个额外的 = 和一个 -c【参考方案4】:

这与 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)

这在带有 arm-linux-androideabi-4.6 工具链的最新 NDK r8b 中有效,但我不能保证它在未来版本中也有效,而且我没有在早期版本中对其进行测试。

【讨论】:

【参考方案5】:

我也遇到了这个问题。我没有找到一种方法来用一个衬里编译 c 和 c++,但是使用 autotools autoconf 它将为每个 .c 和 .cpp 或 .cc 生成正确的配置和 Makefile 以单独编译它们然后链接它们。 https://www.gnu.org/software/automake/manual/html_node/Autotools-Introduction.html

【讨论】:

【参考方案6】:

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

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

【讨论】:

但是g++不会将C文件编译成C++吗? 在给出编译指令时,如果你明确指定为.c,那么据我所知,它可能不会作为.cpp。但请与知道正确的人确认。 用g++编译的C源文件会被编译成C++代码。 @LokiAstari 是的,我刚刚使用 gcc 6.3.0 进行了测试。但是 g++ 可以通过 -x c 选项强制编译为 C 代码。 @GabrielDevillers 如果您知道正确的参数,您可以强制编译器执行任何操作。如果需要,您可以将以“.fart”结尾的文件编译为 C 文件。但这里的重点是默认行为(没有标志)有点出乎意料。通常你会期望编译器尊重文件名后缀(或警告你)。但是 g++ 没有;它将*.c*.cpp 都视为C++ 源文件。这会极大地改变它们的含义(正如您所知,C 和 C++ 是完全不同的语言)。【参考方案7】:

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

【讨论】:

以上是关于使用 GCC 一起编译 C 和 C++ 文件的主要内容,如果未能解决你的问题,请参考以下文章

gcc和g++的区别

gcc与g++:联系区别和命令

gcc和g++的区别解析

gcc/g++ 实战之编译过程

gcc编译器究竟怎么打开?我竟然在gcc的安装文件夹中找不到gcc的打开文件?

在 GCC 中编译 C++ 文件时出错