在没有makefile的情况下使用时如何设置“make”命令?

时间:2016-04-07 08:55:58

标签: makefile

新人在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或任何其他标志?

2 个答案:

答案 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 hellomake 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)'。

同样,您会看到使用的环境变量。