如果我将其发布到错误的堆栈中,请原谅我。每次我对目录中没有任何 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
如果缺少命令,Makefile
该make
工具将尝试使用普通编译命令。
例子
假设我们有以下内容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.o
from ,并通过do创建可执行文件。同样,其他版本的 make 可能会定义其他默认宏和规则(但 CC 和 CFLAGS 似乎是通用的)。foo.c
$(CC) $(CFLAGS) -c foo.c
foo
foo.o
$(CC) $(CFLAGS) -o foo foo.o
如果有不tst
makefile,GNU make 使用上述规则,您可以通过以下方式覆盖宏tst.c
:
make CC=clang CFLAGS='-O2 -g -Wall' tst
我突然不知道其他make如何反应,我似乎记得其他人在没有makefile时会出错。
如果有一个makefile(可能有几个不同的名称,请检查手册;至少makefile
和Makefile
)它定义的宏定义和规则将接管。最多makefile 没有,所以你可以使用上面的命令。但没有任何保证。检查通常名为 INSTALL、README 或某些变体的文件中或 makefile 本身中的任何指令。
最后,还有一些替代方案可供选择(它们的默认控制文件大多称为 的一些变体makefile
),但make(1)
几乎是通用的,它们的使用应该在某处记录。