铛生成文件 "ar: no archive members specified"

标签 c gcc makefile clang unix-ar

我重构了一些 C 代码,并尝试将其编译为 mac 上的 clang 库而不是 linux 上的 gcc。

首先,如果我只运行 make命令我在第一个文件编译时出错:
+++ Compiling [sys_msg.c] clang: error: unsupported argument '-adhlns=../../src/sys_msg.lst' to option 'Wa,'

所以我删除了 -Wa,-adhlns=$(<:.c=.lst)导致此错误的选项。

之后一切似乎都可以编译,但最后一个 .a 文件的汇编失败了,我不明白为什么。

这是我的输出:

+++ Creation of [../../hal/stub/obj]
+++ Dependencies of [hal.c]
+++ Dependencies of [target.c]
+++ Dependencies of [robus.c]
+++ Dependencies of [reception.c]
+++ Dependencies of [sys_msg.c]
+++ Compiling [sys_msg.c]
+++ Compiling [reception.c]
+++ Compiling [robus.c]
+++ Compiling [target.c]
+++ Compiling [hal.c]
ar -rv ../../hal/stub/libstub.a 
ar: no archive members specified
usage:  ar -d [-TLsv] archive file ...
    ar -m [-TLsv] archive file ...
    ar -m [-abiTLsv] position archive file ...
    ar -p [-TLsv] archive [file ...]
    ar -q [-cTLsv] archive file ...
    ar -r [-cuTLsv] archive file ...
    ar -r [-abciuTLsv] position archive file ...
    ar -t [-TLsv] archive [file ...]
    ar -x [-ouTLsv] archive [file ...]
make: *** [../../hal/stub/libstub.a] Error 1

这是我的生成文件:

# make all = Make software and program
# make clean = Clean out built project files.
# make program = Download the hex file to the device, using avrdude.  Please
#                customize the avrdude settings below first!
# make docs = compile with doxygen the code documentation

# Maximum I2C speed (HZ)
SCLFREQ = 400000

#-------------------------------------------------------------------------------
# Tools
#-------------------------------------------------------------------------------

# Set DEBUG variable for once if not coming from command line
ifndef DEBUG
DEBUG = 0
endif

# Tool suffix when cross-compiling
CROSS_COMPILE ?=

# Compilation tools
CC = $(CROSS_COMPILE)gcc
AR = $(CROSS_COMPILE)ar
SIZE = $(CROSS_COMPILE)size
STRIP = $(CROSS_COMPILE)strip
OBJCOPY = $(CROSS_COMPILE)objcopy
OBJDUMP = $(CROSS_COMPILE)objdump
SIZE = $(CROSS_COMPILE)size
GDB = $(CROSS_COMPILE)gdb
NM = $(CROSS_COMPILE)nm

ROOT_PATH = ../..
HAL_PATH = $(ROOT_PATH)/hal/$(BOARD)
DOC_PATH = $(ROOT_PATH)/../extra/Docs

# Doxygen configuration file name
DOXYFILE = $(ROOT_PATH)/../extra/.Doxyfile

OBJ_PATH = $(HAL_PATH)/obj
OUTPUT_NAME = lib$(BOARD)
OUTPUT_FILE_PATH = $(HAL_PATH)/$(OUTPUT_NAME).a

#|---------------------------------------------------------------------------------------|
#| Source files                                                                          |
#|---------------------------------------------------------------------------------------|
include ../sources.mk

#|---------------------------------------------------------------------------------------|
#| Extract file names and path                                                           |
#|---------------------------------------------------------------------------------------|
PROJ_ASRCS   = $(filter %.s,$(foreach file,$(SOURCES),$(file)))
PROJ_ASRCS  += $(filter %.S,$(foreach file,$(SOURCES),$(file)))
PROJ_CSRCS   = $(filter %.c,$(foreach file,$(SOURCES),$(file)))
PROJ_CPPSRCS = $(filter %.cpp,$(foreach file,$(SOURCES),$(file)))

#|---------------------------------------------------------------------------------------|
#| Set important path variables                                                          |
#|---------------------------------------------------------------------------------------|
VPATH    = $(foreach path,$(sort $(foreach file,$(SOURCES),$(dir $(file)))),$(path) :)
INC_PATH = $(INCLUDES)
LIB_PATH = -L$(dir $(RESOURCES_LINKER))

#|---------------------------------------------------------------------------------------|
#| Options for compiler binaries                                                         |
#|---------------------------------------------------------------------------------------|

COMMON_FLAGS = \
-g -O$(OPT)                                                      \
-funsigned-char -fpack-struct -fshort-enums                      \
-Wall -Wstrict-prototypes                                        \
-DMCU=$(MCU)                                                     \
-DMAINCLOCK=$(MAINCLOCK)                                         \
-DSCLFREQ=$(SCLFREQ)                                             \
$(INCLUDES)


ifeq ($(CROSS_COMPILE),avr-)
    COMMON_FLAGS += -mmcu=$(MCU)
    ASFLAGS = -mmcu=$(MCU)
endif

CFLAGS += $(COMMON_FLAGS) -std=gnu99

CPPFLAGS = $(COMMON_FLAGS) -std=gnu++11 -fno-rtti -fno-exceptions

ASFLAGS += -Wa,-adhlns=$(<:.S=.lst),-gstabs -I. -x assembler-with-cpp

LDFLAGS = -Wl,-Map=$(BOARD).map,--cref

#|---------------------------------------------------------------------------------------|
#| Define targets                                                                        |
#|---------------------------------------------------------------------------------------|
#AOBJS += $(patsubst %.S,%.o,$(PROJ_ASRCS))
AOBJS = $(patsubst %.s,%.o,$(addprefix $(OBJ_PATH)/, $(notdir $(PROJ_ASRCS))))
COBJS = $(patsubst %.c,%.o,$(addprefix $(OBJ_PATH)/, $(notdir $(PROJ_CSRCS))))
CPPOBJS = $(patsubst %.cpp,%.o,$(addprefix $(OBJ_PATH)/, $(notdir $(PROJ_CPPSRCS))))

.PHONY: all clean print_info packaging

all: $(OUTPUT_FILE_PATH)

print_info:
    @echo DEFAULT_GOAL ---------------------------------------------------------------------------------
    @echo $(.DEFAULT_GOAL)
    @echo VPATH ---------------------------------------------------------------------------------
    @echo $(VPATH)
    @echo SOURCES -------------------------------------------------------------------------------
    @echo $(SOURCES)
#   @echo PROJ_ASRCS ----------------------------------------------------------------------------
#   @echo $(PROJ_ASRCS)
#   @echo AOBJS ---------------------------------------------------------------------------------
#   @echo $(AOBJS)
    @echo PROJ_CSRCS ----------------------------------------------------------------------------
    @echo $(PROJ_CSRCS)
    @echo COBJS ---------------------------------------------------------------------------------
    @echo $(COBJS)
    @echo PROJ_CPPSRCS --------------------------------------------------------------------------
    @echo $(PROJ_CPPSRCS)
    @echo CPPOBJS -------------------------------------------------------------------------------
    @echo $(CPPOBJS)
    @echo ---------------------------------------------------------------------------------------
    @echo $(CURDIR)
    @echo $(OUTPUT_FILE_PATH)
    @echo ---------------------------------------------------------------------------------------

$(OUTPUT_FILE_PATH): $(OBJ_PATH) ../rules.mk ../sources.mk $(HAL_PATH)/Makefile $(AOBJS) $(COBJS) $(CPPOBJS)
    $(AR) -rv $(OUTPUT_FILE_PATH) $(AOBJS)
    $(AR) -rv $(OUTPUT_FILE_PATH) $(COBJS)
    $(AR) -rv $(OUTPUT_FILE_PATH) $(CPPOBJS)
    $(NM) $(OUTPUT_FILE_PATH) > $(HAL_PATH)/$(OUTPUT_NAME)_symbols.txt

#|---------------------------------------------------------------------------------------|
#| Compile or assemble                                                                   |
#|---------------------------------------------------------------------------------------|
$(AOBJS): $(OBJ_PATH)/%.o: %.s
    @echo +++ Assembling [$(notdir $<)]
    @$(AS) $(AFLAGS) $< -o $@

$(AOBJS): $(OBJ_PATH)/%.o: %.S
    @echo +++ Assembling [$(notdir $<)]
    @$(AS) $(AFLAGS) $< -o $@

$(COBJS): $(OBJ_PATH)/%.o: %.c
    @echo +++ Compiling [$(notdir $<)]
    @$(CC) $(CFLAGS) -c $< -o $@

$(CPPOBJS): $(OBJ_PATH)/%.o: %.cpp
    @echo +++ Compiling [$(notdir $<)]
    @$(CC) $(CPPFLAGS) -c $< -o $@

#|---------------------------------------------------------------------------------------|
#| Output folder                                                                         |
#|---------------------------------------------------------------------------------------|
$(OBJ_PATH):
    @echo +++ Creation of [$@]
    @-mkdir $(OBJ_PATH)

#|---------------------------------------------------------------------------------------|
#| Cleanup                                                                               |
#|---------------------------------------------------------------------------------------|
clean:
    -rm -f $(OBJ_PATH)/* $(OBJ_PATH)/*.*
    -rmdir $(OBJ_PATH)
    -rm -f $(OUTPUT_FILE_PATH)
    -rm -f $(HAL_PATH)/$(OUTPUT_NAME)_symbols.txt
    -rm -rf $(DOC_PATH)

#|---------------------------------------------------------------------------------------|
#| Dependencies                                                                          |
#|---------------------------------------------------------------------------------------|
$(OBJ_PATH)/%.d: %.s $(OBJ_PATH)
    @echo +++ Dependencies of [$(notdir $<)]
    @$(CC) $(AFLAGS) -MM -c $< -MT $(basename $@).o -o $@

$(OBJ_PATH)/%.d: %.S $(OBJ_PATH)
    @echo +++ Dependencies of [$(notdir $<)]
    @$(CC) $(AFLAGS) -MM -c $< -MT $(basename $@).o -o $@

$(OBJ_PATH)/%.d: %.c $(OBJ_PATH)
    @echo +++ Dependencies of [$(notdir $<)]
    @$(CC) $(CFLAGS) -MM -c $< -MT $(basename $@).o -o $@

$(OBJ_PATH)/%.d: %.cpp $(OBJ_PATH)
    @echo +++ Dependencies of [$(notdir $<)]
    @$(CC) $(CPPFLAGS) -MM -c $< -MT $(basename $@).o -o $@

#|---------------------------------------------------------------------------------------|
#| Include dependencies, if existing                                                     |
#| Little trick to avoid dependencies build for some rules when useless                  |
#| CAUTION: this won't work as expected with 'make clean all'                            |
#|---------------------------------------------------------------------------------------|
DEP_EXCLUDE_RULES := clean print_info
ifeq (,$(findstring $(MAKECMDGOALS), $(DEP_EXCLUDE_RULES)))
-include $(AOBJS:%.o=%.d)
-include $(COBJS:%.o=%.d)
-include $(CPPOBJS:%.o=%.d)
endif


#|---------------------------------------------------------------------------------------|
#| Module packaging for Arduino IDE Board Manager                                        |
#|---------------------------------------------------------------------------------------|
packaging: $(OUTPUT_FILE_PATH)

docs:   ( cat $(DOXYFILE) ; echo "OUTPUT_DIRECTORY = $(DOC_PATH)" ; echo "INPUT = $(DOC_SOURCES)" ) | doxygen -
#   doxygen $(DOXYFILE)

%.d:

为什么 clang 提出这个问题?


感谢@MadScientist 我明白为什么我有这个错误,如果我在我的品牌上打印东西,我会得到:

$make print_info 
DEFAULT_GOAL ---------------------------------------------------------------------------------
all
VPATH ---------------------------------------------------------------------------------
../../hal/stub/ : ../../src/ :
SOURCES -------------------------------------------------------------------------------
../../src/sys_msg.c ../../src/reception.c ../../src/robus.c ../../src/target.c ../../hal/stub/hal.c
PROJ_ASRCS ----------------------------------------------------------------------------

AOBJS ---------------------------------------------------------------------------------

PROJ_CSRCS ----------------------------------------------------------------------------
../../src/sys_msg.c ../../src/reception.c ../../src/robus.c ../../src/target.c ../../hal/stub/hal.c
COBJS ---------------------------------------------------------------------------------
../../hal/stub/obj/sys_msg.o ../../hal/stub/obj/reception.o ../../hal/stub/obj/robus.o ../../hal/stub/obj/target.o ../../hal/stub/obj/hal.o
PROJ_CPPSRCS --------------------------------------------------------------------------

CPPOBJS -------------------------------------------------------------------------------

---------------------------------------------------------------------------------------
/Users/nico/Documents/pollen/Robus/robus/hal/stub
../../hal/stub/libstub.a
---------------------------------------------------------------------------------------

我的错误来自于我的 makefile 的这一部分:

PROJ_ASRCS   = $(filter %.s,$(foreach file,$(SOURCES),$(file)))
PROJ_ASRCS  += $(filter %.S,$(foreach file,$(SOURCES),$(file)))

我不想包含所有 .o,因为我进行了多次编译,我只想列出需要的文件。

我的编译过程和ExperimentalCore-sam是一样的项目。

我该怎么做?

最佳答案

我只能假定变量 AOBJS 为空。沿着它的创建位置返回,我只能假设这意味着您的 SOURCES 变量中没有列出 .s.S 文件。

为什么不运行 $(AR) 的单个调用,而只使用 $^ 自动变量并过滤掉 .o 文件,而不是 $(AR) 命令的三个不同调用?

$(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)

关于铛生成文件 "ar: no archive members specified",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42225756/

相关文章:

C 错误 3 错误 C2065 : 'num1' : undeclared identifier

c - 如何计算gcc编译时间?

c - 使用指令 #define 定义指针 : need help to understand this piece of code

Makefile:从目录编译到另一个目录

BBB 上的 Ruby 2.00 编译错误

C++ Makefile 不编译依赖项/链接错误?

c - 指针持有地址以外的东西? [C]

c - C代码如何调用汇编代码(例如优化的strlen)?

gcc - 禁用 GCC 中特定循环的展开

c - 在非常长的字符串中查找频率的最佳方法