【问题标题】:makefile - how to link the objects in all subdirectory togother?makefile - 如何将所有子目录中的对象链接在一起?
【发布时间】:2012-06-05 04:44:49
【问题描述】:

我正在为一个项目编写一个 makefile 框架。比如说,我在顶层目录中有一个 main.c,还有许多子目录,每个子目录都包含一个 C 文件。为了将所有目标文件链接到goter,我在顶部的makefile中分配了一个初始值:

export TARGET_LIST := main.o

在每个子目录中,我将它们附加到列表中:

# sub1/Makefile
TARGET := a.o                                                                                                                                                          
TARGET_LIST += $(TARGET)

返回顶层目录时,TARGET_LIST 仍然在 main.o 中。我确定所有子目录都已输入。有什么好办法吗?

顶级makefile:

all: main

export TOP_DIR = $(shell pwd)
export TARGET_LIST := main.o
SUBDIRS := a b c d

CFLAGS := -Iinc

all:main

main:main.o subdirs
        cc $(TARGET_LIST) -o $@ $(CFLAGS)

subdirs: $(patsubst %, _dir_%, $(SUBDIRS))

$(patsubst %, _dir_%, $(SUBDIRS)) :
        $(MAKE) -C $(patsubst _dir_%, %, $@) $(TGT)

Rules.make:

all:$(TARGET)

%.o:%.c
        @echo $(TARGET_LIST)
        $(CC) -c $^ -o $@ $(CFLAGS) $(LDFLAGS)

子目录makefile:

TARGET := a.o
TARGET_LIST += $(TARGET)
CFLAGS := 
LDFLAGS := 

include $(TOP_DIR)/Rules.make

【问题讨论】:

  • export 不是makefile 的正常部分。如果顶级 makefile 读取每个子目录 makefile,您也许可以做一些事情,但如果顶级 makefile 运行 make 的新副本,则新的 make 没有简单的方法来提供信息回到原来的makefile。
  • 不同子目录下的源文件是否可以同名,例如sub1/a.csub2/a.c?
  • 感谢乔纳森·莱弗勒!我正在考虑现在使用 include。
  • 对于不同目录下的同名文件,这确实是个问题……也许我们要为每个目标文件添加路径。

标签: makefile


【解决方案1】:

帮自己一个忙,如果可以,请使用高级构建系统。几乎任何东西都比手写的 Makefile 更好。例如。 CMakeSConswaf 是一些更受欢迎的替代方案。

【讨论】:

    猜你喜欢
    • 2018-11-18
    • 1970-01-01
    • 2015-10-05
    • 2015-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    相关资源
    最近更新 更多