首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么makefile中的命令总是被执行,即使在所有的先决条件中都没有什么变化?

为什么makefile中的命令总是被执行,即使在所有的先决条件中都没有什么变化?
EN

Stack Overflow用户
提问于 2022-03-25 10:34:37
回答 2查看 116关注 0票数 0

我有一个C项目,这个结构是这个问题的最后一部分,

根中有一个主makefile,AppCode\Comp2中有3个makefile,AppCode\Comp3中有一个主makefile,AppCode\头灯中有3个makefile。

我想:

  1. 将AppCode\Comp2中的所有c文件编译为对象文件,然后将这些对象文件编译为库文件(文件)

对于AppCode\headlamp中的每个子目录,

  1. 都执行与1相同的步骤,在本例中是AppCode\Comp3

$(OBJ_FILES)中

  1. 搜索所有目录中的目标文件(*.o)期望AppCode

  1. 将AppCode $(ALL_a_in_AppCode)和o文件$(OBJ_FILES)中的所有文件链接到精灵文件

  1. 基于

创建十六进制文件

主makefile将调用sub的makefile,

根中有我的主要makefile:

代码语言:javascript
复制
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文件):任何人都可以告诉我为什么总是执行这两个命令,以及如何修复它?

谢谢!

代码语言:javascript
复制
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>

以下是我的项目结构:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2022-03-25 11:12:32

执行all的命令是因为它没有创建名为all的文件。这就是为什么它总是被执行的原因。

为了防止这种情况,您不应该对all目标使用任何命令,而应该只对与同名文件对应的目标使用任何命令。

erika3app.elf的问题可能与AppCodeLib有关,后者似乎也是一个虚假的目标。make不知道生成AppCodeLib的规则可能更新哪些文件。您应该将它用作该目标将实际创建/更新的文件的依赖项。或者AppCodeLib会更新任何对象文件?

下面的示例假设AppCodeLib的规则将在$(OBJ_FILES)中创建/更新对象文件。

示例:

代码语言:javascript
复制
# ...

.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。

票数 0
EN

Stack Overflow用户

发布于 2022-03-29 05:40:11

您的目标all/AppCodeLib/$(AppCodeSubDirs)是虚假的目标,这意味着它们不是磁盘上的文件,因此它们的规则将在每次生成时执行,因此目标依赖于它们。例如,您的$(OBJCOPY)命令将不会生成一个名为"all“的文件,而您的erika3app.elf依赖于AppCodeLib,而AppCodeLib并不是一个不知道它是否”准备好“的文件。

代码语言:javascript
复制
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“的文件(我对此不确定),您可以:

代码语言:javascript
复制
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依赖于实际文件,例如

代码语言:javascript
复制
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

要点是您需要依赖于实际的文件。

编辑:

一个简单的例子:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71615505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档