我有一个C项目,这个结构是这个问题的最后一部分,
根中有一个主makefile,AppCode\Comp2中有3个makefile,AppCode\Comp3中有一个主makefile,AppCode\头灯中有3个makefile。
我想:
对于AppCode\headlamp中的每个子目录,
$(OBJ_FILES)中
创建十六进制文件
主makefile将调用sub的makefile,
根中有我的主要makefile:
include rules.mk
rwildcard=$(wildcard $1$2)$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))
ALL_C_in_AppCode := $(call rwildcard,./AppCode,*.c)
ALL_O_in_AppCode := $(call rwildcard,./AppCode,*.o)
ALL_a_in_AppCode := $(call rwildcard,./AppCode,*.a)
AppCodeSubDirs := $(wildcard AppCode/**)
OBJPATH_IN_AppCode :=$(addsuffix /obj,$(AppCodeSubDirs))
APATH_IN_AppCode :=$(addsuffix /lib,$(AppCodeSubDirs))
APPCode_DIR = .\APPCode
CDD_dir =.\CDD
DemoAppCode_dir = .\DemoAppCode
Intergration_dir =.\Intergration
MCAL_dir=.\MCAL
VOS_BSW_dir=.\VOS\BSW
VOS_BSW_Config_dir=.\VOS\BSW_config
VOS_erika_dir=.\VOS\erika
VOS_LIB_dir=.\VOS\Lib
OBJ_FILES = $(wildcard $(CDD_dir)/*.o)
OBJ_FILES += $(wildcard $(DemoAppCode_dir)/*.o)
OBJ_FILES += $(wildcard $(Intergration_dir)/*.o)
OBJ_FILES += $(wildcard $(MCAL_dir)/*.o)
OBJ_FILES += $(wildcard $(VOS_BSW_dir)/*.o)
OBJ_FILES += $(wildcard $(VOS_BSW_Config_dir)/*.o)
OBJ_FILES += $(wildcard $(VOS_erika_dir)/*.o)
OBJ_FILES += $(wildcard $(VOS_LIB_dir)/*.o)
LDFLAGS = -mtc162 -T
all:erika3app.elf
$(OBJCOPY) --set-start 0x0000 -R .ram -R .sbRam -R .sb_fix_ram -I elf32-tricore -O ihex erika3app.elf erika3app.hex
erika3app.elf:$(OBJ_FILES) AppCodeLib
$(LD) $(LDFLAGS) .\Intergration\out\ee_tc_gcc_flash.ld -nostartfiles -Wl,--gc-sections -Wl,-Map=erika3app.map -L . -L .\Intergration\out\ -L .\Intergration\erika\mk $(OBJ_FILES) -o "erika3app.elf" -L .\Intergration\erika\lib -Wl,--start-group -lee -Wl,--end-group
AppCodeLib: $(AppCodeSubDirs)
$(AppCodeSubDirs):
make -C $@
clean:
-rm -rf $(OBJPATH_IN_AppCode) $(APATH_IN_AppCode) erika3app.hex erika3app.elf erika3app.map
print-%: ; @echo $* = $($*)
.PHONY:$(AppCodeSubDirs)如果我执行make,那么erika3app.elf和all的命令似乎总是被执行,如下所示(我省略了一些没有处理的o文件):任何人都可以告诉我为什么总是执行这两个命令,以及如何修复它?
谢谢!
PS D:\TEST\project> .\build.bat
make -C AppCode/headlamp
make[1]: Entering directory 'D:/TEST/project/AppCode/headlamp'
C:\VOS_tools_repo\hightec_ifx\v4.9.2.0\bin\tricore-ar.exe csr lib/libheadlamp.a obj/app1.o obj/app21.o obj/app2.o
make[1]: Leaving directory 'D:/TEST/project/AppCode/headlamp'
make -C AppCode/Comp3
make[1]: Entering directory 'D:/TEST/project/AppCode/Comp3'
C:\VOS_tools_repo\hightec_ifx\v4.9.2.0\bin\tricore-ar.exe csr lib/libComp3.a obj/33.o
make[1]: Leaving directory 'D:/TEST/project/AppCode/Comp3'
make -C AppCode/Comp2
make[1]: Entering directory 'D:/TEST/project/AppCode/Comp2'
C:\VOS_tools_repo\hightec_ifx\v4.9.2.0\bin\tricore-ar.exe csr lib/libComp2.a obj/22.o
make[1]: Leaving directory 'D:/TEST/project/AppCode/Comp2'
C:\VOS_tools_repo\hightec_ifx\v4.9.2.0\bin\tricore-gcc.exe -mtc162 -T .\Intergration\out\ee_tc_gcc_flash.ld -nostartfiles -Wl,--gc-sections -Wl,-Map=erika3app.map -L . -L .\Intergration\out\ -L .\Intergration\erika\mk .\DemoAppCode/Rte_Chas_SA_FDD_IBCInfo.c.o .\VOS\Lib/qn_strcpy.c.o -o "erika3app.elf" -L .\Intergration\erika\lib -Wl,--start-group -lee -Wl,--end-group
C:\VOS_tools_repo\hightec_ifx\v4.9.2.0\bin\tricore-objcopy.exe --set-start 0x0000 -R .ram -R .sbRam -R .sb_fix_ram -I elf32-tricore -O ihex erika3app.elf erika3app.hex
PS D:\TEST\project>
PS D:\TEST\project>
PS D:\TEST\project>
PS D:\TEST\project> .\build.bat
make -C AppCode/headlamp
make[1]: Entering directory 'D:/TEST/project/AppCode/headlamp'
C:\VOS_tools_repo\hightec_ifx\v4.9.2.0\bin\tricore-ar.exe csr lib/libheadlamp.a obj/app1.o obj/app21.o obj/app2.o
make[1]: Leaving directory 'D:/TEST/project/AppCode/headlamp'
make -C AppCode/Comp3
make[1]: Entering directory 'D:/TEST/project/AppCode/Comp3'
C:\VOS_tools_repo\hightec_ifx\v4.9.2.0\bin\tricore-ar.exe csr lib/libComp3.a obj/33.o
make[1]: Leaving directory 'D:/TEST/project/AppCode/Comp3'
make -C AppCode/Comp2
make[1]: Entering directory 'D:/TEST/project/AppCode/Comp2'
C:\VOS_tools_repo\hightec_ifx\v4.9.2.0\bin\tricore-ar.exe csr lib/libComp2.a obj/22.o
make[1]: Leaving directory 'D:/TEST/project/AppCode/Comp2'
C:\VOS_tools_repo\hightec_ifx\v4.9.2.0\bin\tricore-gcc.exe -mtc162 -T .\Intergration\out\ee_tc_gcc_flash.ld -nostartfiles -Wl,--gc-sections -Wl,-Map=erika3app.map -L . -L .\Intergration\out\ -L .\Intergration\erika\mk .\DemoAppCode/Rte_Chas_SA_FDD_IBCInfo.c.o .\DemoAppCode/Rte_EN_SA_FDD_WaterTemp1Info.c.o ..\VOS\Lib/qn_strnlen.c.o .\VOS\Lib/qn_memset.c.o .\VOS\Lib/qn_strncpy.c.o .\VOS\Lib/qn_strlen.c.o .\VOS\Lib/qn_strcpy.c.o -o "erika3app.elf" -L .\Intergration\erika\lib -Wl,--start-group -lee -Wl,--end-group
C:\VOS_tools_repo\hightec_ifx\v4.9.2.0\bin\tricore-objcopy.exe --set-start 0x0000 -R .ram -R .sbRam -R .sb_fix_ram -I elf32-tricore -O ihex erika3app.elf erika3app.hex
PS D:\TEST\project>以下是我的项目结构:
D:.
| build.bat
| clean.bat
| makefile
| rules.mk
|
+---AppCode
| +---Comp2
| | | 22.c
| | | makefile
| | |
| |
| +---Comp3
| | | 33.c
| | | makefile
| | |
| |
| \---headlamp
| | makefile
| |
| +---left
| | app1.c
| | app1.h
| |
| \---right
| | app2.c
| | app2.h
| |
| \---rightright
| app21.c
|
+---CDD
| \---include
+---DemoAppCode
| Rte_Chas_SA_FDD_IBCInfo.c.o
|
+---Intergration
| | applSignature.oil
| | Dcm_CallOut.c.o
| |
| +---erika
| | +---lib
| | | libee.a
| | |
| | \---mk
| | ee.mk
| | ee_arch_cfg.mk
| |
| \---out
| ee_applcfg.h
|
+---MCAL
| Can_17_McmCan.c.o
| Wdg_17_Scu_PBcfg.c.o
|
+---other
\---VOS
+---BSW
| api_standalone.c.o
|
+---BSW_Config
| BswMBswMConfig_0_CommonPBcfg.c.o
| WdgM_PBcfg.c.o
|
+---erika
| ee_bss_data_init.c.o
| ee_oscfg.c.o
| osSignature.oil
|
\---LIB
libee.a
qn_memcpy.c.o发布于 2022-03-25 11:12:32
执行all的命令是因为它没有创建名为all的文件。这就是为什么它总是被执行的原因。
为了防止这种情况,您不应该对all目标使用任何命令,而应该只对与同名文件对应的目标使用任何命令。
erika3app.elf的问题可能与AppCodeLib有关,后者似乎也是一个虚假的目标。make不知道生成AppCodeLib的规则可能更新哪些文件。您应该将它用作该目标将实际创建/更新的文件的依赖项。或者AppCodeLib会更新任何对象文件?
下面的示例假设AppCodeLib的规则将在$(OBJ_FILES)中创建/更新对象文件。
示例:
# ...
.PHONY: all AppCodeLib
all: erika3app.hex
erika3app.hex: erika3app.elf
$(OBJCOPY) --set-start 0x0000 -R .ram -R .sbRam -R .sb_fix_ram -I elf32-tricore -O ihex erika3app.elf
erika3app.elf: $(OBJ_FILES)
$(LD) $(LDFLAGS) .\Intergration\out\ee_tc_gcc_flash.ld -nostartfiles -Wl,--gc-sections -Wl,-Map=erika3app.map -L . -L .\Intergration\out\ -L .\Intergration\erika\mk $(OBJ_FILES) -o "erika3app.elf" -L .\Intergration\erika\lib -Wl,--start-group -lee -Wl,--end-group
$(OBJ_FILES): AppCodeLib
AppCodeLib: $(AppCodeSubDirs)
# ...如果您为子目录中的代码创建库,并将这些库链接到您的应用程序,那么您可能也需要libraies的依赖关系。
您可以考虑在这样一个复杂的项目中使用CMake。
发布于 2022-03-29 05:40:11
您的目标all/AppCodeLib/$(AppCodeSubDirs)是虚假的目标,这意味着它们不是磁盘上的文件,因此它们的规则将在每次生成时执行,因此目标依赖于它们。例如,您的$(OBJCOPY)命令将不会生成一个名为"all“的文件,而您的erika3app.elf依赖于AppCodeLib,而AppCodeLib并不是一个不知道它是否”准备好“的文件。
all:erika3app.elf
$(OBJCOPY) --set-start 0x0000 -R .ram -R .sbRam -R .sb_fix_ram -I elf32-tricore -O ihex erika3app.elf erika3app.hex
erika3app.elf:$(OBJ_FILES) AppCodeLib
$(LD) $(LDFLAGS) .\Intergration\out\ee_tc_gcc_flash.ld -nostartfiles -Wl,--gc-sections -Wl,-Map=erika3app.map -L . -L .\Intergration\out\ -L .\Intergration\erika\mk $(OBJ_FILES) -o "erika3app.elf" -L .\Intergration\erika\lib -Wl,--start-group -lee -Wl,--end-group
AppCodeLib: $(AppCodeSubDirs)
$(AppCodeSubDirs):
make -C $@要解决这个问题,需要将命令置于非虚假目标下,例如,如果$(OBJCOPY)命令生成一个名为"ihex“的文件(我对此不确定),您可以:
all: erika3app.elf ihex
ihex:
$(OBJCOPY) --set-start 0x0000 -R .ram -R .sbRam -R .sb_fix_ram -I elf32-tricore -O ihex erika3app.elf erika3app.hex并使AppCodeLib依赖于实际文件,例如
AppCodeLib: AppCode\Comp2\22.a AppCode\Comp3\33.a ...
AppCode\Comp2\22.a:
make -C AppCode\Comp2
AppCode\Comp3\33.a:
make -C AppCode\Comp3
# Use `%` to make a pattern要点是您需要依赖于实际的文件。
编辑:
一个简单的例子:
CC = gcc
CFLAGS = -W -Wall -g
LFLAGS = -lm
all: AppCodeLib main.x
AppCodeSubDirs = AppCode/Comp2 AppCode/Comp3
Libs = AppCode/Comp2/22.o AppCode/Comp3/33.o # tested with .o, make it .a
main.x: main_c.c $(Libs) # depends on real files
$(CC) $(CFLAGS) -o $@ $< $(LFLAGS)
AppCodeLib: $(AppCodeSubDirs)
$(AppCodeSubDirs):
make -C $@
.PHONY: all AppCodeLib $(AppCodeSubDirs)https://stackoverflow.com/questions/71615505
复制相似问题