新人在ubuntu中用C学习编程 以hello.c为例 从一些视频教程我看到老师可以使用“make hello”编译hello.c而无需在当前目录中设置Makefile 命令就像
bash$ make hello
gcc -g -Wall hello.c -o hello
我尝试在自己的ubuntu 14.04上使用make 我安装了build-essential并尝试了相同的hello.c
bash$ make hello
cc hello.c -o hello
如上所述 如何更改-g,-Wall或任何其他标志?
答案 0 :(得分:1)
make
的工作方式是通过已知的食谱从来源中生成目标。
当您编写自己的 Makefile 时,会为其提供配方,但是,make
具有可以使用的内部配方。您可以按make -p
列出它们。
其中一个食谱告诉make
如何生成< something>超出< something> .c。当您运行make hello
时,make
检查如何生成 hello ,发现有一个文件 hello.c 并且它知道如何生成来自 hello.c 的 hello - 使用该内部规则。
现在规则看起来像这样。
%: %.c
# recipe to execute (built-in):
$(LINK.c) $^ $(LOADLIBES) $(LDLIBS) -o $@
而重要的部分$(LINK.c)
看起来像这样
LINK.c = $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH)
此时您不需要理解语法,重要的是,您的make hello
将被转换为(某些未使用的变量被省略)
$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) hello.c -o hello
现在 CC , CFLAGS , CPPFLAGS 和 LDFLAGS 可由make
设置(在在您的情况下, CC 设置为" cc"其余未设置),但您可以使用环境变量覆盖它。你想要的是
CC=gcc
CFLAGS="-g -Wall"
要为一个命令执行此操作,只需运行:
CC=gcc CFLAGS="-g -Wall" make hello
要在一个会话中执行此操作(直到关闭终端),请运行
export CC=gcc
export CFLAGS="-g -Wall"
,然后只要你想要make hello
或make whatever
。
要永久执行此操作,请在.profile
文件中设置这些变量(打开~/.profile
(如果它不存在则创建)并添加
export CC=gcc
export CFLAGS="-g -Wall"
到它。或者只是运行
echo 'export CC=gcc' >> ~/.profile
echo 'export CFLAGS="-g -Wall"' >> ~/.profile
在这两种情况下,您都需要source ~/.profile
或启动新终端。它将永远幸福地工作。
答案 1 :(得分:0)
Make有一个number of implicit rules,在没有Makefile的情况下使用。
关于.c
文件的文件是:
n.o是从n.c自动生成的,其形式为
$(CC) $(CPPFLAGS) $(CFLAGS) -c
这意味着您可以设置环境变量:
CC
设置使用的编译器; CPPFLAGS
设置使用的预处理程序标志(例如,用于C ++ .cpp
或Fortran .F
源); CFLAGS
设置使用的编译器标志。 隐式规则将.c
源文件转换为.o
目标文件,然后根据另一个隐式规则将其链接到可执行文件:
n是通过C编译器运行链接器(通常称为ld)从n.o自动生成的。使用的精确配方是'$(CC)$(LDFLAGS)n.o $(LOADLIBES)$(LDLIBS)'。
同样,您会看到使用的环境变量。