【问题标题】:Multiple files as arguments to make. Is my approach ok?多个文件作为要制作的参数。我的方法可以吗?
【发布时间】:2012-03-08 12:11:29
【问题描述】:

我正在尝试为我的实验室问题创建一个通用的 makefile。有五个任务,每个任务都需要编译和运行单独的 C 文件。因为我在使用 gcc 时必须包含一些额外的库,所以我只想输入 make ZAD=first second 并编译 first.c 和 second.c。问题是我不知道如何正确遍历makefile 中的ZAD 列表。我可以在for 循环中分离任务,但我不能在这个循环中强制使用换行符。这个例子会更好解释(以下是我的makefile):

ZAD = first second

main: $(foreach dir, $(ZAD), $(dir).o) 
    $(foreach dir, $(ZAD), gcc $(dir).o -lgsl -lgslcblas -lm -o $(dir))
    $(foreach dir, $(ZAD), rm $(dir).o)

first.o: first.c
    gcc -Wall -c first.c

second.o: second.c
    gcc -Wall -c second.c

这是我尝试仅编译 second.c 时得到的结果:

wojtasskorcz@wojtek-laptop:~/mownit/lab1dom$ make ZAD=second
gcc -Wall -c second.c
gcc second.o -lgsl -lgslcblas -lm -o second
rm second.o

一切都很好,但是当我尝试一次编译 first.c 和 second.c 时,会发生以下情况:

wojtasskorcz@wojtek-laptop:~/mownit/lab1dom$ make ZAD='first second'
gcc first.o -lgsl -lgslcblas -lm -o first  gcc second.o -lgsl -lgslcblas -lm -o second
gcc: error: gcc: No such file or directory
make: *** [main] Error 1

我得出的结论是,这是因为在 makefile 中的第二个 foreach 中没有换行符。但我不知道如何将它插入那里。或者也许有另一种方法来解决这个问题?

编辑:
Beta 解决了问题,虽然这是我找到的另一种方法here

所以我编辑的 makefile 看起来像这样:

define \n


endef

ZAD = first second

main: $(foreach dir, $(ZAD), $(dir).o)
    $(foreach dir, $(ZAD), gcc $(dir).o -lgsl -lgslcblas -lm -o $(dir)${\n})
    $(foreach dir, $(ZAD), rm $(dir).o${\n})

%.o: %c
    gcc -Wall -c %.c

现在一切正常。再次感谢 Beta 的回答。

【问题讨论】:

  • 使用模式规则有什么问题??
  • 老实说,我不知道他们。似乎是个好主意,但我看不出如何将它们用于我的main 规则。当然first.osecond.o 可以很容易地转换为模式规则。你能解释更多吗?或者改写我的main 规则?
  • 好吧,除了:SO 再次发挥它的魔力!

标签: unix gcc makefile


【解决方案1】:

应该这样做:

%: %.o
    gcc $^ -lgsl -lgslcblas -lm -o $@

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

通过make -r first second调用它。

第一条规则说“从something.o 构建something”。第二个说“从something.c 构建something.o”。调用中的 -r 表示“不要使用内置规则”(因为有一个内置规则用于在 something.c 之外构建 something,它优先于第一条规则)。

【讨论】:

  • 感谢您的回复,很有魅力!虽然它的工作原理对我来说有点神秘,所以我设法找到了一种只稍微编辑我的代码的方法,我已经在下面发布了它。
猜你喜欢
  • 2013-10-19
  • 2015-12-29
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 2013-10-26
  • 1970-01-01
相关资源
最近更新 更多