【问题标题】:How to compile files in a subdirectory with a makefile如何使用 makefile 编译子目录中的文件
【发布时间】:2019-10-19 10:23:55
【问题描述】:

这是我的目录的样子:

src/
    dir/
        file2.c
        file2.h
    file1.c
    file1.h
    makefile

当我使用我的 makefile 时,我得到: gcc: error: file2.o: No such file or directory

从 src 目录使用:gcc -c dir/file2.c dir/file2.h 我得到了在src 中创建的正确.o(这就是我想要的)。 但是使用makefile,我得到了上面的错误。

我的makefile最简单的版本:

CFLAGS = -ansi -Wall -pedantic -g -I$(LIBRE_INC) -Iinclude -std=gnu99
LDFLAGS = -lm
EXEC = out
CC = gcc

out :  file1.o file2.o
    ${CC} -o $@ $^ $(CFLAGS) $(LDFLAGS)

file1.o: file1.c file1.h

file2.o: dir/file2.c dir/file2.h

%.o : %.c
    ${CC} -c $< $(CFLAGS) $(LDFLAGS)

品牌给出:

gcc -c file1.c -ansi -Wall -pedantic -g -I -Iinclude -std=gnu99 -lm
gcc -o out file1.o file2.o -ansi -Wall -pedantic -g -I -Iinclude -std=gnu99 -lm
gcc: error: file2.o: No such file or directory
makefile:7: recipe for target 'out' failed
make: *** [out] Error 1

我知道问题出在

%.o : %.c
    ${CC} -c $< $(CFLAGS) $(LDFLAGS)

但我不知道如何替换它

编辑: 我在每个有子目录的文件下添加了这一行,它工作了

${CC} -c $< $(CFLAGS) $(LDFLAGS)

如果有的话,我还在寻找更好的方法!

【问题讨论】:

  • 关于这些语句:CFLAGS = -ansi -Wall -pedantic -g -I$(LIBRE_INC) -Iinclude -std=gnu99 LDFLAGS = -lm EXEC = out CC = gcc 这将导致 make 工具在每次引用宏时重新评估每个宏。强烈建议将= 替换为:=

标签: c gcc makefile


【解决方案1】:

%.o: %.c 告诉 make 如果file2.c 存在它可以构建file2.o,如果dir/file2.c 存在它可以构建dir/file2.o。但是你想从dir/file2.c 构建file2.o。您的 makefile 没有提供有关如何执行此操作的任何说明。

如果您在不同的目录中从来没有同名的文件,通常很方便的一种解决方案是告诉 make 在不同的目录中搜索源文件。使用VPATH variablevpath directive,如果在顶层目录中找不到源文件,您可以指示make 在dir 中查找源文件。添加

VPATH = dir

vpath %.c dir

vpath file2.c dir

到你的makefile。

【讨论】:

    【解决方案2】:

    将所有目标文件存储在一个目录中,即使源文件位于不同的目录中,也是自找麻烦。当您拥有init.cdir/init.c 时会发生什么?目标文件init.o 相互覆盖。

    我会将每个file2.o 替换为dir/file2.o,它应该可以工作。

    另外,你的模式规则

    %.o : %.c
        ${CC} -c $< $(CFLAGS) $(LDFLAGS)
    

    不使用$@ 来引用目标,根据正确的makefile 工程应该这样做:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 2015-10-08
      相关资源
      最近更新 更多