每次当我尝试从没有提供makefile的源代码编译某些应用程序时(他们没有提供makefile的原因可能是普通用户开箱即用),我想制作目标文件中的所有文件,然后将所有目标文件合并为二进制文件。
例如:
gcc *.c *.f90 *.f *.inc -o % first command
gcc *.o -o a.out % second command
我发现的问题通常是通过这种方法,第一个命令必须运行几次,以确保所有文件都已正确转换为目标文件。先前尝试的失败可能是由依赖性引起的,即一些目标文件只能在创建其他目标文件后才能创建。
我想知道我们是否可以正确设置制作这些目标文件的顺序,以便通过运行第一个命令一次可以创建所有目标文件?当前示例的顺序为* .c * .f90 * .f * .inc。我通常做的另一种方法是(1)ls>> makefile(2)根据makefile列表创建一个make文件。
我意识到基于Windows的虚拟工作室在这方面非常聪明,因为用户不需要理清编译顺序。这可能是没有提供makefile的原因。
答案 0 :(得分:2)
make manual显示了如何使用$(patsubst %.c,%.o,$(wildcard *.c))
根据.c源获取.o文件列表。您可以使用foreach
对多个后缀执行相同的操作。
$(foreach s,c f90 f inc,$(patsubst %.$s,%.o,$(wildcard *.$s)))
现在你需要做的就是告诉你a.out的依赖关系是什么(目标文件),制作a.out的方法(我简单地复制了下面的内置方法),以及如何编译。 f90和.inc文件,因为make不知道那些(它已经知道如何编译.c和.f文件)。
你需要为.inc提供自己的配方,并且我再次复制.f90的.F文件的内置配方,以便可能需要调整。
a.out: $(foreach s,c f90 f inc,$(patsubst %.$s,%.o,$(wildcard *.$s)))
$(LINK.o) $^ $(LOADLIBES) $(LDLIBS) -o $@
%.o: %.f90
$(COMPILE.F) $(OUTPUT_OPTION) $<
%.o: %.inc
insert .inc compile recipe here