【问题标题】:What is an efficient workflow with C? - Makefile + bash script什么是 C 语言的高效工作流程? - Makefile + bash 脚本
【发布时间】:2010-09-02 06:03:44
【问题描述】:

我正在处理我的第一个项目,该项目将跨越多个 C 文件。对于我的第一个练习程序,我只是在main.c 中编写代码并使用gcc main.c -o main 编译。在我学习的过程中,这对我有用。

现在,我自己在做一个更大的项目。我想继续自己进行编译(或者至少手动设置),这样我就可以理解这个过程。看了一会,决定做一个Makefile。

注意:我也在使用 GTK+,所以我必须查找如何将其添加到编译命令中。

这是经过一番研究后的样子:

main:
    gcc -Wall -g main.c -o main `pkg-config --cflags --libs gtk+-2.0`

起初,我只是运行“make”。然后我遇到了一些问题,即使我更改了文件,也会收到错误“main is up to date”。

于是我写了一个脚本:

#!/bin/bash
rm main
make
./main

所以我进行更改,然后运行此脚本。

这是一个好的/正常的系统吗?我想要一个可扩展的系统,因为我的项目会增长。我假设我可以保留该脚本,只需将依赖项添加到 makefile 并更改 makefile 中的主编译命令。我说的对吗?

提前致谢。

编辑:

感谢有关如何修复我的 Makefile 的反馈。

那么典型的编译过程是 1) 输入 make 然后 2) ./main 而不管项目是如何设置的或它的大小(假设您已经编写了正确的 makefile)?

【问题讨论】:

  • 是的,你是对的。你先做一个make,然后做一个./main
  • 太好了,谢谢!到目前为止似乎很容易学习。

标签: c bash makefile compilation


【解决方案1】:

您需要告诉 make main 依赖于 main.c。这样,每次您对main.c 进行更改然后运行make 时,都会重新生成main。要删除main,您可以有一个名为clean 的虚假目标:

main:main.c
    gcc -Wall -g main.c -o main `pkg-config --cflags --libs gtk+-2.0`

.PHONY: clean
clean:
    rm -f main

现在删除main 你可以这样做:make clean

如果你得到make: main is up to date.,这意味着你没有修改main.c,因此不需要重新生成main。但是,如果您必须强制重新生成main,即使依赖项尚未更新,您也可以按照Sjoerd 在其他答案中的建议使用make-B 选项。

【讨论】:

  • clean 目标上方添加一行.PHONY: clean 很有用,以防万一名为“clean”的文件(例如shell 脚本)最终出现在目录中。如果发生这种情况,make 将看到该文件而不运行 clean 目标。 PHONY 告诉它不要看。
  • 非常有帮助的评论,@aaron。谢谢。
【解决方案2】:
  • 使用make -Bmake --always-make 编译,即使目标是最新的
  • 在冒号后附加文件名以检查这些文件名是否已更新。

例子:

a: a.c
        gcc -o a a.c

a 只有在 a.ca 更新时才会被构建。

【讨论】:

  • 对于更大的项目,make -B 可能不是人们想要使用的。
  • 对。如果某些文件的修改时间不正确, -B 将很有用。例如,当您在输出文件上复制某些内容时,就会发生这种情况。
【解决方案3】:

我发现命令行make 足以满足我的需求,但是手动编写Makefiles 变得相当麻烦。随着您的项目变得越来越复杂,您会发现手动管理依赖项变得越来越烦人。我建议你做的是学习如何做以下至少一项:

  • 通过调用 gcc -M 来编写依赖跟踪 Makefile
  • 学习使用Makefile 生成器,例如automakeCMake。我个人更喜欢automake,因为它更成熟(并且不会做一些愚蠢的事情,比如尝试将分号分隔的列表放在命令行上)。

【讨论】:

  • +1 用于提及可用的 Makefile 生成器。我去看看。
猜你喜欢
  • 2014-09-09
  • 2010-12-03
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 2016-12-03
  • 1970-01-01
相关资源
最近更新 更多