【问题标题】:Make two c programs in one makefile在一个makefile中制作两个c程序
【发布时间】:2017-10-03 09:39:09
【问题描述】:

是否可以在一个 makefile 中创建两个文件?本质上是programprogramtest。我看过其他答案,但它们的语法完全超出了我的想象。现在我的 Makefile 只制作了其中一个程序,我不知道如何让它同时制作两个程序

有人可以提供一个模板来说明如何构建 Makefile 来编译两个程序吗?

【问题讨论】:

  • 让我们看看你现在有什么?
  • 我在下面看到的三个答案都有一个缺陷,他们没有将all 列为makefile 中的第一个目标。第一个目标是当你只运行make 时生成的——它通常应该构建目录中的所有内容。 makefile 也都存在没有为 C 编译器及其参数使用足够的宏的缺陷。确保使用${CC} -c ${CFLAGS} $* 之类的东西可以让您在命令行上兼顾编译器和标志。你可以得到更详细的信息,但使用宏非常重要。

标签: c unix gcc makefile


【解决方案1】:
    all: main test

    test: objects/Math.o objects/Stack.o objects/Queue.o objects/myUnitTesting.o objects/test.o
            gcc objects/test.o objects/Math.o objects/Stack.o objects/Queue.o objects/myUnitTesting -o test

    main: objects/Stack.o objects/Queue.o objects/Math.o objects/Point.o objects/main.o
            gcc objects/main.o objects/Stack.o objects/Queue.o objects/Point.o objects/Math.o -o main

    objects/test.o: test.c
            gcc -g -Wall -O -c -o objects/test.o test.c

    objects/main.o: main.c
            gcc -g -Wall -O -c -o objects/main.o main.c

    objects/myUnitTesting.o: cs/myUnitTesting.c
            gcc -g -Wall -O -c -o objects/myUnitTesting cs/myUnitTesting.c

    objects/Math.o: cs/Math.c
            gcc -g -Wall -O -c -o objects/Math.o cs/Math.c

    objects/Stack.o: cs/Stack.c
            gcc -g -Wall -O -c -o objects/Stack.o cs/Stack.c

    objects/Queue.o: cs/Queue.c
            gcc -g -Wall -O -c -o objects/Queue.o cs/Queue.c

    objects/Point.o: cs/Point.c
            gcc -g -Wall -O -c -o objects/Point.o cs/Point.c

    clean:
            rm -f objects/*o main

那么你只需要输入:

    make all

它会编译你的 main.ctest.c 文件

【讨论】:

  • 谢谢!是不是意味着“所有”都需要成为虚假目标?
  • 它会同时编译它们
  • 按照惯例首先列出all 目标,这样当您只键入make 时,一切都已完成。
【解决方案2】:

您可以在一个 makefile 中使用多个 exe,这是构建 2 的示例, 你需要全力以赴构建

prog1: prog1.o
    gcc prog1.o -o prog1 2>>compile.log 1>&2

prog2: prog2.o
    gcc prog2.o -o prog2 2>>compile.log 1>&2

all: prog1 prog2

.c.o:
    gcc -o $@ -c $*.c 2>>compile.log 1>&2

【讨论】:

  • 按照惯例先列出all 目标,这样当您只键入make 时,一切都已完成。
【解决方案3】:

这是一个场景,其中 2 个目标是 main1main2

TARGET1 = main1
TARGET2 = main2

$(TARGET1): main1.o
    gcc main1.o -o $@

$(TARGET2): main2.o
    gcc main2.o -o $@

%.o: %.c
    gcc -c $< -o $@

run1: $(TARGET1)
    ./$(TARGET1)

run2: $(TARGET2)
    ./$(TARGET2)

all: $(TARGET1) $(TARGET2)
    ./$(TARGET1)
    ./$(TARGET2) 

请记住,缩进是&lt;tab&gt; 字符,而不是空格字符。

以下命令将编译并运行main1 可执行文件。

make run1

以下命令将编译并运行main2 可执行文件。

make run2

以下命令将编译并运行main1 可执行文件,然后是main2 可执行文件。

make all

【讨论】:

  • 通常在两个单独的目标之前列出all 目标。这样,当你只运行make 时,一切都做好了。就目前而言,仅运行make 只会构建main1 而不是main2。让all 目标运行程序也是一种惯例——它应该只构建它们。如果您想全部运行它们,请使用 runall 目标(我想;我认为没有为此目的的既定名称)。
【解决方案4】:

这是可能的。 这是一个更简单的 Makefile 版本:

all: program programtest

program:
    gcc -o program program.c

programtest:
    gcc -o programtest programtest.c

然后你只需输入make:

$ make
gcc -o program program.c
gcc -o programtest programtest.c

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 2011-01-08
    相关资源
    最近更新 更多