gcc会自动使用-ansi、-pedantic和-Wall开关进行编译

3

我们需要使用gcc以以下方式编译C源代码:

gcc -ansi -pedantic -Wall program.c

我想知道如何将以下操作“自动化”,使得当我输入:

gcc program.c

它将会自动编译这3个开关。这是否可能?

5个回答

9

您还可以使用make的隐式规则,这样您就不必为每个程序编写makefile。如果您输入make foo,并且当前目录中存在foo.c文件,Make将自动调用编译器。要添加标志,请在环境变量中定义变量CFLAGS,例如,在bash中添加export CFLAGS="-Wall -pedantic -ansi".bashrc中。

但是,如果您的程序依赖于多个文件,则必须创建一个makefile,但是对于C编译,只需列出依赖项,只要其中一个与目标具有相同的基本名称即可。

例如,对于此makefile:

# Makefile
foo:foo.o bar.o

运行make将执行命令。

gcc $CFLAGS -c -o foo.o foo.c
gcc $CFLAGS -c -o bar.o bar.c
gcc -o foo foo.o bar.o

无需添加任何规则即可完成。


8
为了自动化任意数量的构建步骤/复杂参数,您应该使用makefile
一旦您拥有makefile,您只需要键入:make

2
因为提出了一个硬编码(并且有问题的)Makefile,而忽略了在环境中使用“export CFLAGS = ...”的隐式规则,这正是Jef Ty想要的。 (请参见Scott Wales的答案)。 - mbauman
@Matt B:Makefile 的目的只是为了介绍 Makefile 的概念,同时提供最简单的例子,可以通过输入 make 命令来运行。没有使用隐式规则。我已经删除了这个例子。如果不是今天,那么很可能 OP 会想用他的 Makefile 做一些更复杂的事情。 - Brian R. Bondy

3
alias gcc="gcc -ansi -pedantic -Wall"

但是就像@Brian所说的,你真的应该使用一个makefile,或者更好的是像CMakeSCons这样的构建系统。


3
我会将其称为除了“gcc”以外的其他名称,这样如果我想要在非疯狂且碎嘴的模式下使用它,我仍然可以调用“gcc”。 - nategoose
如果你想调用“plain”gcc而不调用别名,你需要在命令前面加上反斜杠\gcc以防止别名替换。 - dadinck

2
您可以使用一个shell脚本,根据其调用方式进行一些提示,并在适当设置CFLAGS后调用make进行偶尔的单独构建。
假设您有一个名为/usr/bin/compile的shell脚本,它查看$0以查看实际调用它的名称。然后,您可以创建名为pedanticfullwarn等的符号链接。
在shell脚本中,可以这样写:
OLDCFLAGS=$CFLAGS
WHATAMI=$(basename $0)

case "$WHATAMI" in
    pedantic)
        export CFLAGS="-Wall -pedantic -ansi"
        make $@
        exit $?
    ;;
    c99)
        export CFLAGS="-std=c99 ... ... ..."
        ....

然后,为了使用额外的naggy标志编译foo.c:

pedantic foo

这非常方便,比如试图编译某人在问题中发布的代码或者学习如何使用新库等一次性构建。但对于其他任何情况,请像其他人所说的那样使用makefile。


2

传统的方式是使用Makefile,特别是在进行更大型构建时。

如果您经常想要在没有Makefile的情况下进行构建,则可以在您的.bashrc或等效文件中定义别名:alias gcc=gcc -ansi -pedantic -Wall


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