【问题标题】:Compile all source files into executables将所有源文件编译成可执行文件
【发布时间】:2014-02-23 19:55:39
【问题描述】:

我知道 makefile 用于文件相关的项目。但我想以不同的方式使用它。

由于我总是写很多测试文件,每次编译都需要打一堆flag,太麻烦了。我只想编写一个makefile,将所有源文件编译成具有相应名称的可执行文件——比如a.cab.cb等,这样我就可以通过简单地输入make而不是整个 gcc ...

有什么简单的方法吗?

【问题讨论】:

  • 学习脚本。这真的很简单而且有益。如果你愿意,我可以给你看我的。我创建了一个可以一直编译的makefile
  • @KRUKUSA 是的,我很快就会学习脚本,但现在我正在学习 C,而且还很新。所以我需要这个来提高效率:)。如果你能分享你的,那就太好了。

标签: shell makefile


【解决方案1】:

Make 有一个内置的隐式规则,如下所示:

  % : %.c
         $(CC) -o $@ $(CFLAGS) $<

$(CFLAGS) 将包含您的所有选项。

然后,做

make foo

会尝试从 foo.c 生成 foo(如果存在的话)。

为了能够一次编译所有这些,添加另一个规则:

all: $(patsubst %.c,%,$(wildcard *.c))

这条名为“all”的新规则将您的可执行文件列表作为其先决条件。通配符函数列出了目录中的所有 .c 文件,而 patsubst 从每个文件中删除 .c ,留下将由每个 .c 文件生成的可执行文件的列表。

这样做

make all

使其尝试将每个 .c 文件编译成相应的可执行文件。

【讨论】:

  • 我了解其中的大部分内容,但对所有的先决条件感到困惑。 patsubst 是做什么的? * 不是已经暗示通配符了吗?为什么要在前面加上'wildcard'?
  • @Xufeng 好的,已经编辑解释得更好了
【解决方案2】:

好的,明白了。我不太确定你是否会理解语法。我会尽量解释清楚。

您将创建一个名为 Makefile 的文件,没有扩展名。

DIR=$(HOME)/../"Your directory"

all: "Whatever driver you may have"

purify: purify g++ -o "Your file" -Wall -pedantic -g "objective file .o extension"

# Makes clean file
clean:
        rm -f *.o  "Drivers"

new:
    make clean
    make

【讨论】:

  • 净化有什么作用?为什么在编译器名称之前需要它?另外,我是否需要用我想要的输出文件的名称显式替换“您的文件”?我希望 makefile 实际上自动生成它的名称。
  • 是的。如果你想运行 valgrind,Purify 检查内存泄漏
  • 这有各种问题。我不会用它作为例子。
【解决方案3】:

make 已内置隐式规则来执行此操作。只需输入 make amake bmake a b 或任何您想要的。如果要添加任何特殊选项,请添加并导出名为 CFLAGS 的环境变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 2015-05-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多