当我运行 Make "filename" 时,如何更改 gcc 的默认参数

当我运行 Make "filename" 时,如何更改 gcc 的默认参数

如果我将其发布到错误的堆栈中,请原谅我。每次我对目录中没有任何 Makefiles 的文件运行 make 时,make 仍然可以工作并编译源代码,但仅使用参数:gcc filename.c -o filename

例如,如果我make test在目录中输入 test.c,它会:gcc test.c -o test

我希望改变这一点,这样每当我在没有 Makefile 的情况下运行 make 时,它​​就会执行以下操作:gcc -ggdb -std=c99 -Wall -Werror -o filename filename.c -lcs50 -lm

我还认为此更改将成为永久性的,并且无论我重新启动或更改目录都不会更改。

我目前在 AMD 64 位处理器上运行 Crunchbang Weezy。

答案1

你想要CFLAGS环境变量。

例如:

$ export CFLAGS='-ggdb3'
$ make test
cc -ggdb3    test.c   -o test

答案2

通常,当您键入时,make test如果缺少命令,Makefilemake工具将尝试使用普通编译命令。

例子

假设我们有以下内容test.c

$ cat test.c 
#include <stdio.h>
int main()
{
    printf( "I am alive!  Beware.\n" );
    return 0;
}

如果没有Makefile当我们运行时,make test我们会得到以下行为:

$ make test
cc     test.c   -o test

笔记:后续运行将导致:

$ make test
make: `test' is up to date.

测试运行:

$ ./test 
I am alive!  Beware.

如果您正在输入 make test,那么您必须有一个Makefile地方。当我在没有的目录中运行该命令时,Makefile我得到以下信息:

$ make test
make: *** No rule to make target `test'.  Stop.

使用CFLAGS

如果你想覆盖make默认的命令行选项,你可以这样做:

$ export CFLAGS="-ggdb -std=c99 -Wall -Werror -lcs50 -lm"

现在当我们运行时make

$ make test
cc -ggdb -std=c99 -Wall -Werror -lcs50 -lm    test.c   -o test

参考

答案3

[编辑]

来自 GNU make 手册页:

如果没有 -f 选项,make 将按顺序查找 makefile GNUmakefile、makefile 和 Makefile。

CFLAGS仅当您在 Makefile 中定义了变量时才可以传递参数:

CC=gcc
CFLAGS=-g -O -Wall -Werror

all: foo

foo: foo.o
    $(CC) $(CFLAGS) $<

在这里您可以使用以下命令覆盖变量

$ make CFLAGS="-ggdb -std=c99 -Wall -Werror"
gcc -ggdb -std=c99 -Wall -Werror   -c -o foo.o foo.c
gcc -ggdb -std=c99 -Wall -Werror foo.o

然而,编辑 Makefile 更容易。

答案4

这取决于make(1)您所获得的确切信息以及所使用的 makefile。

例如,GNU make 假设了一组默认规则和宏,很有帮助。即,宏 CC 给出了 C 编译器的名称,CXX 给出了 C++ 编译器的名称; CFLAGS 是 CC 的标志,CXXFLAGS 是 CXX 的标志。

它还定义了一系列默认规则,即通过调用创建foo.ofrom ,并通过do创建可执行文件。同样,其他版本的 make 可能会定义其他默认宏和规则(但 CC 和 CFLAGS 似乎是通用的)。foo.c$(CC) $(CFLAGS) -c foo.cfoofoo.o$(CC) $(CFLAGS) -o foo foo.o

如果有tstmakefile,GNU make 使用上述规则,您可以通过以下方式覆盖宏tst.c

make CC=clang CFLAGS='-O2 -g -Wall' tst

我突然不知道其他make如何反应,我似乎记得其他人在没有makefile时会出错。

如果有一个makefile(可能有几个不同的名称,请检查手册;至少makefileMakefile)它定义的宏定义和规则将接管。最多makefile 没有,所以你可以使用上面的命令。但没有任何保证。检查通常名为 INSTALL、README 或某些变体的文件中或 makefile 本身中的任何指令。

最后,还有一些替代方案可供选择(它们的默认控制文件大多称为 的一些变体makefile),但make(1)几乎是通用的,它们的使用应该在某处记录。

相关内容