我正在尝试将在不同目录中创建的多个文件添加到静态库中,但显然它不能按预期工作。
我的makefile结构是这样的:
./src/drv/platform/AVR/
- hal
- hw
--- spi
--- uart
hal
中,我在名为$(LIB_TARGET)
的{{1}}中定义了一个库名称,并且所有libHal
文件都应该存档在该库中。*.o
我在名为hw
的{{1}}中定义了另一个图书馆名称,$(LIB_TARGET)
和libHw
中的所有*.o
文件都应该包含在库:首先使用hw/spi
中的目标文件创建库hw/uart
并且永远不会错过它们,然后创建libHw
中的对象并将其添加到hw/spi
。 hw/uart
添加到库中。在运行结束时,我应该在另一个库目录中(如在另一个位置)2个库,libHw
和*.o
,libHal
包含libHw
中的所有内容,{{ 1}} libHal
中的所有内容。在这种情况下,目录hal
没有任何源文件,如下所示:
libHw
每个hw
和hw
子目标都包含这样的内容:
SUBDIRS:= spi uart
LIB_TARGET = libHw.a
.PHONY: $(SUBDIRS) clean all
default: all
$(SUBDIRS)::
$(MAKE) -C $@ $(MAKECMDGOALS)
all clean : $(SUBDIRS)
文件uart
仅包含通用平台定义。
包含所有后缀规则的通用makefile spi
的代码。
include $(TGT_BASE)/make/generic.mk
SRCS := uart.c
include $(TGT_BASE)/make/rules.mk
大多数
中存在的makefile现在问题是有时generic.mk
中的某些rules.mk
文件未添加到.PHONY : all clean
OBJS = $(SRCS:.c=.o)
DEPS = $(OBJS:.o=.d)
LIB_TARGETT = $(LIB_DIR)/$(LIB_TARGET)
### Archive into a library file (.a)
$(LIB_DIR)/%.a: $(OBJS)
@echo $(MSG_L)
@echo 'Adding $^ to library $@'
$(AR) $(ARFLAGS) $@ $^
@echo $(MSG_L)
### rule for c files
%.o: %.c
@echo $(MSG_C)
$(CC) -c $(CFLAGS) $(MODULES_INC) $(TGT_LOCAL_INCLUDES) $< -o $@
@echo $(MSG_C)
### make dependencies
%.d: %.c
@echo $(MSG_D)
$(CC) -E -MM $(CFLAGS) $(MODULES_INC) $(TGT_LOCAL_INCLUDES) $(CURDIR)/$< > $@
@echo $(MSG_D)
all: $(DEPS) $(OBJS) $(LIB_TARGETT)
clean:
$(RM) -rf *.o *.d .depend
中定义的库中。在调试中运行make会发现make本身认为库的先决条件比上次访问库更早,所以错过了它们。
*.o
为了更好地解释它在这里工作的方式是一个例子
hw/uart
这是一个例子,如果它不工作
hw
我正在使用make Found an implicit rule for 'F:/automata/tmp/remake//tmp/app/brick/lib/atmega328p/libHw.a'.
Pruning file 'uart.o'.
Finished prerequisites of target file 'F:/automata/tmp/remake//tmp/app/brick/lib/atmega328p/libHw.a'.
Prerequisite 'uart.o' is older than target 'F:/automata/tmp/remake//tmp/app/brick/lib/atmega328p/libHw.a'.
和make[7]: Entering directory 'F:/automata/tmp/remake/src/drv/platform/AVR/hw/uart
'
-------- make c --------
avr-gcc -c -Wall -Werror -Os -mmcu=atmega328p -IF:/automata/tmp/remake//tmp/ap
p/brick -IF:/automata/tmp/remake/src/common/h -IF:/automata/tmp/remake/src/drv/p
latform/AVR/hw/spi -IF:/automata/tmp/remake/src/drv/platform/AVR/hw/uart -IF:/au
tomata/tmp/remake/src/modules/interface/cli -IF:/automata/tmp/remake/src/drv/pl
atform/AVR/hw/uart uart.c -o uart.o
-------- make c --------
------- make Lib -------
Adding uart.o to library F:/automata/tmp/remake//tmp/app/brick/lib/atmega328p/li
bHw.a
avr-ar rcs F:/automata/tmp/remake//tmp/app/brick/lib/atmega328p/libHw.a uart.o
------- make Lib -------
make[7]: Leaving directory 'F:/automata/tmp/remake/src/drv/platform/AVR/hw/uart'
。
所以我知道如何强迫make不要错过那些对象?或者查看他们的实时创建并将其正确添加到库中?请记住,有时会添加它们,但有时它们不会添加。
谢谢。
答案 0 :(得分:0)
当你说它与make all --debug=a
一起运行时总能正常工作时,它始终有效:哪部分重要?如果您运行make all
它是否始终有效?或者,如果您运行make --debug=a
,它是否始终有效?或者你必须使用它们才能使它始终有效吗?
由于您没有显示所有的makefile,我们不能说太多。例如,您如何设置OBJS
的值?您在何处以及如何定义构建目标文件的规则(或者您是否正在使用make的内置规则)?这些信息至关重要。看起来发生的事情是make要求你构建一个文件,但是你的规则构建了一个不同的文件,因此make看到它所期望的文件实际上没有更新,也没有做任何事情。
另外,在您的概述中,您会谈论dir1
,dir2
,dir2.1
等内容,但在您提供的错误输出中却非常令人困惑不同的路径。我们无法确定&#34;真实&#34;示例中的路径名与概览中的伪路径匹配。
请在任何地方使用实际路径,或编辑示例输出以使用伪路径,这样我们就可以看到哪些路径正在做什么。