如何在Mac OS X终端上使用make编译C程序

12
我最近购买了一台MacBook Pro,想要在终端中使用C语言进行编程。
我能够通过以下命令编译代码:
gcc filename.c –o filename

但我想用make命令编译它,因为我知道这是最佳实践,我想遵循最佳实践。

make filename cc filename.c -o filename

这个命令给我以下输出:
make: Nothing to be done for `ex01'.
make: *** No rule to make target `cc'.  Stop.

请注意,我已经安装了Xcode和Xcode开发者命令行工具,在文件夹/usr/bin中我看到了makemakefile属性。
我应该怎么做才能使用makefile和cc参数进行编译?

gcc filename.c –o filename 中,"–" 是一个 en dash,而不是 ASCII 0x2D ("-")。(适用于所有版本。) - Peter Mortensen
3个回答

17
在相同路径下创建一个名为Makefile的文件,并在其中添加以下内容:
CC = cc
CFLAGS = -std=c99 -pedantic -Wall
OBJECTS = filename.o

all: appname

filename.o: filename.c
    $(CC) $(CFLAGS) -c filename.c

appname: $(OBJECTS)
    $(CC) $(OBJECTS) -o appname

clean:
    rm -f *.o appname

然后运行:

make

当然,将 appname 替换为您的程序名称。
注意: 必须在之前有一个“制表符”(而非空格)。
$(CC) $(CFLAGS) -c filename.c

并且

$(CC) $(OBJECTS) -o appname

and

rm -f *.o appname

1
谢谢Alter Mann,解决了我的问题,我现在很愉快地享受在终端中编码。还有一个问题,即使它解决了问题,你知道为什么这个命令不起作用吗?make filename cc filename.c -o filename是因为它在MacOS上不支持,还是配置有问题,或者这不是正确的方法? - user1869741
1
@bigpop,任何系统上的任何make都不支持该命令行语法。不知道你从哪里得到的,但无论你在哪里得到的,将来都应避免使用它作为参考。此外,我不理解答案中的语句“变量赋值之前必须有一个空行”:我不知道有这样的要求。 - MadScientist
@MadScientist 是的,你说得对,我不会使用它,我只是有点困惑:s。无论如何,感谢您的解释,非常感激:)。 - user1869741
1
为什么不在rm -f *.o appname之前也这样做呢?它会有什么不同吗? - Peter Mortensen

5

我不知道你具体做了什么,但我认为错误在于运行了错误的命令。你输入了make filename cc filename.c -o filename,但教程指导我们使用 make filename,不需要cc filename.c -o filename部分。也许你看的是旧版本的教程?

而且,make filename可以正常工作。 你不需要Makefile文件


顺便提一下,这是我遇到问题并解决它的方式:

  1. typed the code below, and saved it in a file named "ex1"

      int main(int argc, char *argv[])
      {
          puts("Hello, World!");
    
          return 0;
      }
    
  2. typed make ex1in terminal

  3. got error message make: Nothing to be done for 'ex1'.

正如您所看到的,我的错误在于源代码文件名应为 ex1.c,而不是 ex1

当我将文件名更改为 ex1.c,并执行 make ex1 时,它就可以运行了。


1

Enter image description here

使用:

make [filename]

./[filename]

如果文件名为test.c并保存在桌面上,则命令如下:
cd Desktop

make test

./test

请查看 *为什么在提问时不上传代码/错误的图片?(例如,"图片应该只用于说明无法以其他方式清晰表达的问题,例如提供用户界面的截图。"*),并采取适当的行动(它也涵盖了答案)。提前致谢。 - Peter Mortensen

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