我重构了一些C代码,我尝试将它编译为mac上的clang而不是linux上的gcc。
首先,如果我只是运行make命令,我在第一个文件编译时遇到错误:+++编译[…
我理解GCC和Clang之间的区别。
如果你运行一个GCC ar 没有指定归档成员的命令,他只是跳过这一步。 Clang在这种情况下引发错误并停止构建。
ar
要修补它,我只检查我的列表是否为空:
$(OUTPUT_FILE_PATH): $(OBJ_PATH) ../rules.mk ../sources.mk $(HAL_PATH)/Makefile $(AOBJS) $(COBJS) $(CPPOBJS) ifneq ($(strip $(AOBJS)),) $(AR) -rv $(OUTPUT_FILE_PATH) $(AOBJS) endif ifneq ($(strip $(COBJS)),) $(AR) -rv $(OUTPUT_FILE_PATH) $(COBJS) endif ifneq ($(strip $(CPPOBJS)),) $(AR) -rv $(OUTPUT_FILE_PATH) $(CPPOBJS) endif
我只能假设变量 AOBJS 是空的。回到它创建的地方,我只能假设这意味着没有 .s 要么 .S 您的文件中列出的文件 SOURCES 变量。
AOBJS
.s
.S
SOURCES
你为什么不运行一次调用 $(AR) 并且只是使用 $^ 自动变量和过滤掉 .o 文件,而不是三个不同的调用 $(AR) 命令?
$(AR)
$^
.o
$(AR) -rv $(OUTPUT_FILE_PATH) $(filter %.o,$^)
编辑 要明确我建议您将输出目标规则更改为:
$(OUTPUT_FILE_PATH): $(OBJ_PATH) ../rules.mk ../sources.mk $(HAL_PATH)/Makefile $(AOBJS) $(COBJS) $(CPPOBJS) $(AR) -rv $(OUTPUT_FILE_PATH) $(filter %.o,$^) $(NM) $(OUTPUT_FILE_PATH) > $(HAL_PATH)/$(OUTPUT_NAME)_symbols.txt
或者,如果你想更正确地说:
$(OUTPUT_FILE_PATH): $(OBJ_PATH) ../rules.mk ../sources.mk $(HAL_PATH)/Makefile $(AOBJS) $(COBJS) $(CPPOBJS) $(AR) -rv $@ $(filter %.o,$^) $(NM) $@ > $(HAL_PATH)/$(OUTPUT_NAME)_symbols.txt
如上所述,我肯定会删除 $(OBJ_PATH) 来自先决条件清单。
$(OBJ_PATH)