使用 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++ 文件的主要内容,如果未能解决你的问题,请参考以下文章