我有以下程序结构:
main.c
Makefile
Submodule
--{somefiles}
--Makefile
子模块正在创建库submodule.a
。它有很多源文件,需要一些库。
我只想知道
Makefile
知道如何制作submodule.a
Makefile
设置变量SUBMODULE_LDFLAGS
和SUBMODULE_LDLIBS
如何在根项目目录中编写Makefile
:
submodule.a
SUBMODULE_LDFLAGS
和SUBMODULE_LDLIBS
添加到自己的变量中吗?最后,我希望主Makefile
中的以下命令正常工作:
TARGET = MyProgram
OBJS = $(TARGET).o submodule/submodule.a
$(TARGET): $(OBJS)
$(CC) $(CFLAGS) $(LDFLAGS) $^ -o $@ $(LDLIBS)
现在它创建MyProgram.o
并且无法创建MyProgram
,因为Makefile
不知道如何制作submodule/submodule.a
。
我可以添加一行:
submodule/submodule.a:
make -C submodule
但它不会帮助我找不到库。
答案 0 :(得分:2)
子Make没有直接的方法将变量传递给父进程。 (至少)有两种间接方式。
你可以让sub-Make写一个包含变量值的文件,然后可以读取父Make。
您可以复制构建这些变量的submodule/Makefile
部分,并将其放入Makefile
。更好的是,您可以将该代码隔离在一个单独的文件中,然后两个makefile将include
。
修改
递归Make的一个缺点是它会中断Make的依赖性处理。在这种情况下,当且仅当库中的一个源被更改时,没有干净的方法来运行子make。
您可以将子模块源列表 - 或构造列表的代码 - 放在一个单独的文件中,两个makefile将include
。然后,这些文件可以是$(TARGET)
。
或者,你可以使submodule/submodule.a
成为PHONY目标。在这种情况下,Make每次都会重建二进制文件,否则它将完美地运行。