2017-02-14 13 views
0

私はいくつかのCコードをリファクタリングしています。linuxではgccの代わりにmacのclangでlibとしてコンパイルしようとしています。clang makefile "ar:アーカイブメンバーが指定されていません"

まず第一に、私はちょうど私が最初のファイルのコンパイルでエラーが発生しました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 [email protected] 

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

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

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

#|---------------------------------------------------------------------------------------| 
#| Output folder                   | 
#|---------------------------------------------------------------------------------------| 
$(OBJ_PATH): 
    @echo +++ Creation of [[email protected]] 
    @-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 [email protected]).o -o [email protected] 

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

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

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

#|---------------------------------------------------------------------------------------| 
#| 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: 

打ち鳴らすは私にこれを上げるのはなぜ?


私はこのエラーを持っている理由私は私のメイクで物事を印刷する場合、私が得た、理解 @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 
--------------------------------------------------------------------------------------- 

私のミスは私のメイクファイルのこの部分のために来る:

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

私は複数のコンパイルを行うため、すべての.oファイルを含めたくありません。必要なファイルをリストしたいだけです。

私はExperimentalCore-samプロジェクトと同じコンパイルプロセスを持っています。

どうすればいいですか?

+0

あなたのループのために '$(foreachのファイル、$(SOURCES)、$(ファイル))'何もしていません。あなたはそれが元のリストを取り戻すのは非常にリソース集中型の方法だ... SOURCES' 'と各自がその言葉にそれを展開するための各単語をループを言っています。あなたが非常にトリッキーな二重評価のことをやろうとしているのでない限り。 – MadScientist

+0

はい、私は別のファイルのバージョンで別のlibをコンパイルするためです。私はすべてのオブジェクトを含める必要はありません。私はこのプロジェクトと同じビルドシステムを使用します。[ExperimentalCore-SAM](https://github.com/aethaniel/ExperimentalCore-sam) –

+0

申し訳ありませんが、私はあなたのコメントや何それは私に関係していると理解していません。私が言っているすべては '$(foreachのファイル、$(SOURCES)、$(ファイル))' '$(ソース)'書くのは非常に非効率的な方法以外の何物でもないということです。あなたは同じ結果を得るでしょう。あなたは '$(SOURCES)'の値をループしています。リストの各要素について、同じ要素を取得しています。 – MadScientist

答えて

1

変数AOBJSは空であると仮定できます。それが作成された場所に戻って、私はただ.sまたは.SファイルがあなたのSOURCES変数にリストされていないことを仮定することができます。

は、なぜあなたは$(AR)の単一の呼び出しを実行し、ちょうど$^自動変数を使用して.oファイルではなく、$(AR)コマンドの三つの異なる呼び出しを除外しませんか?

$(OUTPUT_FILE_PATH): $(OBJ_PATH) ../rules.mk ../sources.mk $(HAL_PATH)/Makefile $(AOBJS) $(COBJS) $(CPPOBJS) 
     $(AR) -rv [email protected] $(filter %.o,$^) 
     $(NM) [email protected] > $(HAL_PATH)/$(OUTPUT_NAME)_symbols.txt 
:あなたはより多くの慣用的に正しいことを望んだ場合、

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

をまたは:

$(AR) -rv $(OUTPUT_FILE_PATH) $(filter %.o,$^) 

EDITは、私はあなたがこれまであなたの出力ターゲット規則を変更示唆しています明確にするために、

上記のとおり、前提条件リストから$(OBJ_PATH)を削除しています。

+0

が、私はそれを行います。 –

+0

SOURCESリストは、任意の '' .s'または.S'ファイル、(私たちが発見したとして:それはあなたの元の問題の原因となったものです)、その後AOBJS' 'の値は空になりますが含まれていない場合は(そう$'の値をAOBJS) 'は空になるので、' $^'自動変数の値にはオブジェクトが含まれません。私の変化は、あなたが以前に持っていたことにあなたに矛盾のない行動を与えます。 – MadScientist

1

私はGCCとClangの違いを理解しています。あなたが指定したアーカイブ・メンバーとarコマンドを実行した場合、彼はちょうどステップをスキップGCCで

。 この場合、Clangはエラーを発生させ、ビルドを停止します。

は私のリストが空であるかどうか、私はちょうどチェックし、それにパッチを適用するには、次の

$(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 
+0

私の提案するソリューションを以下に使用したくない理由がわかりません。それははるかに簡単であり、 'ar 'を3回だけではなく1回呼び出すので、より効率的です。 – MadScientist

+0

あなたの提案はより一般的なものですが、私の場合、私のアーカイブメンバーを選択する必要があります。私はこのメイクファイルを毎回異なる入力ファイルで複数回実行します。このアーカイブに競合するバイナリを追加したくありません。 –

+0

上記の私のコメントを参照してください。あなたのメークファイルは、すべての状況で私と同じように動作します。 – MadScientist

関連する問題