2016-07-11 6 views
2

私は、ARM mbedライブラリを利用してきれいに整理されたmakefileプロジェクトテンプレートを作成しようとしています。私はすでにいくつかの問題を解決しました(see this post)ヘッダーファイルのパスに関連していますが、現在はリンカーに問題があります)。どちらかデバッグをリリースにおける最終的なバイナリ。メークファイルリンク:_exitへの未定義参照

ここでは、私はこれが私のメイクです...

make 
arm-none-eabi-g++ -DTARGET_M4 -DMBED_BUILD_TIMESTAMP=1453683815.81 -DTOOLCHAIN_GCC_ARM -DTOOLCHAIN_GCC -DTARGET_RTOS_M4_M7 -DTARGET_FF_MORPHO -DTARGET_CORTEX_M -D__FPU_PRESENT=1 -DTARGET_FF_ARDUINO -DTARGET_STM32F446RE -DTARGET_NUCLEO_F446RE -D__MBED__=1 -DTARGET_STM -DTARGET_STM32F4 -D__CORTEX_M4 -DARM_MATH_CM4 -std=c++98 -fno-rtti -I lib/ -I lib/mbed/ -I lib/mbed/TARGET_NUCLEO_F446RE/ -I lib/mbed/TARGET_NUCLEO_F446RE/TARGET_STM/ -I lib/mbed/TARGET_NUCLEO_F446RE/TARGET_STM/TARGET_STM32F4/ -I lib/mbed/TARGET_NUCLEO_F446RE/TOOLCHAIN_GCC_ARM/ -I lib/mbed/TARGET_NUCLEO_F446RE/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F446RE/ -o obj/main.o src/main.cc 
/usr/lib/gcc/arm-none-eabi/6.1.1/../../../../arm-none-eabi/lib/libc.a(lib_a-exit.o): In function `exit': 
exit.c:(.text.exit+0x2c): undefined reference to `_exit' 
collect2: error: ld returned 1 exit status 
make: *** [makefile:54: obj/main.o] Error 1 

取得しています。問題(s)があるかもしれないところ私が示されているエラーですしかしわかりません。 #Projectは プロジェクトをパラメータ= Nucleo_blink OBJECTS = OBJ/main.o DEST =デバッグ VPATH = SRC LIB $ DEST TARGET = NUCLEO_F446REあなたが尋ねる前に、私はすでに--specs=nosys.specs--specs=nano.specsを変更しようとしている

#Compilation options 
DEBUG = 1 

#Tools 
AS  = $(GCC_BIN)arm-none-eabi-as 
CC  = $(GCC_BIN)arm-none-eabi-gcc 
CXX  = $(GCC_BIN)arm-none-eabi-g++ 
LD  = $(GCC_BIN)arm-none-eabi-gcc 
OBJCOPY = $(GCC_BIN)arm-none-eabi-objcopy 
OBJDUMP = $(GCC_BIN)arm-none-eabi-objdump 
SIZE = $(GCC_BIN)arm-none-eabi-size 

include $(TARGET).mk 

CFLAGS = $(INCLUDE_PATHS) $(CC_SYMBOLS) $(CPU) -c -g -fno-common -fmessage-length=0 -Wall -Wextra -fno-exceptions -ffunction-sections -fdata-sections -fomit-frame-pointer -MMD -MP 

ifeq ($(HARDFP),1) 
     FLOAT_ABI = hard 
else 
     FLOAT_ABI = softfp 
endif 

ifeq ($(DEBUG), 1) 
     CFLAGS += -DDEBUG -O0 
else 
     CFLAGS += -DNDEBUG -Os 
endif 

#MY PROBLEM MAY BE HERE 
LD_FLAGS = $(CPU) -Wl,--gc-sections --specs=nano.specs -Wl,--wrap,main -Wl,-Map=$(PROJECT).map,--cref 
#`-u _printf_float -u _scanf_float` after -specs for floating point I/O 

LD_SYS_LIBS = -lstdc++ -lsupc++ -lm -lc -lgcc -lnosys 

LIBRARIES = -lmbed 

.PHONY: all clean lst size 

all: $(PROJECT).bin $(PROJECT).hex 

clean: 
    rm -f debug/* obj/* asm/* $(DEPS) 

obj/%.o: %.c 
     $(CC) $(CC_FLAGS) $(CC_SYMBOLS) -std=c99 $(INCLUDE_PATHS) -o [email protected] $< 

obj/%.o: %.cc 
     $(CXX) $(CC_FLAGS) $(CC_SYMBOLS) -std=c++98 -fno-rtti $(INCLUDE_PATHS) -o [email protected] $< 

obj/%.o: %.cpp 
     $(CXX) $(CC_FLAGS) $(CC_SYMBOLS) -std=c++98 -fno-rtti $(INCLUDE_PATHS) -o [email protected] $< 

obj/%.o: %.asm 
     $(CC) $(CPU) -c -x assembler-with-cpp -o asm/[email protected] $< 

#OR HERE 
$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS) 
     $(LD) $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o $(DEST)/[email protected] $^ $(LIBRARIES) $(LD_SYS_LIBS) $(LIBRARIES) $(LD_SYS_LIBS) 

$(PROJECT).bin: $(PROJECT).elf 
     $(OBJCOPY) -O binary $< [email protected] 

$(PROJECT).hex: $(PROJECT).elf 
     @$(OBJCOPY) -O ihex $< [email protected] 

$(PROJECT).lst: $(PROJECT).elf 
     @$(OBJDUMP) -Sdh $< > [email protected] 

lst: $(PROJECT).lst 

size: $(PROJECT).elf 
     $(SIZE) $(PROJECT).elf 

DEPS = $(OBJECTS:.o=.d) $(SYS_OBJECTS:.o=.d) 
-include $(DEPS) 

。それは何もしません。奇妙な部分は、上記のリンカ設定が自動的に生成されたmbedメイクファイルに対してうまく動作することです。

ここには動作するメイクファイルがあります。これは、エラーなしでコンパイル...

# This file was automagically generated by mbed.org. For more information, 
# see http://mbed.org/handbook/Exporting-to-GCC-ARM-Embedded 

GCC_BIN = 
PROJECT = Nucleo_blink 
OBJECTS = ./source/main.o 
SYS_OBJECTS = #Long list of object files 
INCLUDE_PATHS = -I. -I./source -I./mbed -I./mbed/TARGET_NUCLEO_F446RE -I./mbed/TARGET_NUCLEO_F446RE/TARGET_STM -I./mbed/TARGET_NUCLEO_F446RE/TARGET_STM/TARGET_STM32F4 -I./mbed/TARGET_NUCLEO_F446RE/TARGET_STM/TARGET_STM32F4/TARGET_NUCLEO_F446RE -I./mbed/TARGET_NUCLEO_F446RE/TOOLCHAIN_GCC_ARM 
LIBRARY_PATHS = -L./mbed/TARGET_NUCLEO_F446RE/TOOLCHAIN_GCC_ARM 
LIBRARIES = -lmbed 
LINKER_SCRIPT = ./mbed/TARGET_NUCLEO_F446RE/TOOLCHAIN_GCC_ARM/STM32F446XE.ld 

############################################################################### 
AS  = $(GCC_BIN)arm-none-eabi-as 
CC  = $(GCC_BIN)arm-none-eabi-gcc 
CPP  = $(GCC_BIN)arm-none-eabi-g++ 
LD  = $(GCC_BIN)arm-none-eabi-gcc 
OBJCOPY = $(GCC_BIN)arm-none-eabi-objcopy 
OBJDUMP = $(GCC_BIN)arm-none-eabi-objdump 
SIZE = $(GCC_BIN)arm-none-eabi-size 

ifeq ($(HARDFP),1) 
     FLOAT_ABI = hard 
else 
     FLOAT_ABI = softfp 
endif 


CPU = -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=$(FLOAT_ABI) 
CC_FLAGS = $(CPU) -c -g -fno-common -fmessage-length=0 -Wall -Wextra -fno-exceptions -ffunction-sections -fdata-sections -fomit-frame-pointer -MMD -MP 
CC_SYMBOLS = -DTARGET_M4 -DTARGET_FF_ARDUINO -DTOOLCHAIN_GCC_ARM -DTOOLCHAIN_GCC -DTARGET_RTOS_M4_M7 -DTARGET_FF_MORPHO -DTARGET_LIKE_MBED -DTARGET_CORTEX_M -D__FPU_PRESENT=1 -DTARGET_LIKE_CORTEX_M4 -DTARGET_NUCLEO_F446RE -D__MBED__=1 -DTARGET_STM -DMBED_BUILD_TIMESTAMP=1468213384.59 -DTARGET_STM32F446RE -DTARGET_STM32F4 -D__CORTEX_M4 -DARM_MATH_CM4 

#My makefile above copies these two lines 
LD_FLAGS = $(CPU) -Wl,--gc-sections --specs=nano.specs -u _printf_float -u _scanf_float -Wl,--wrap,main -Wl,-Map=$(PROJECT).map,--cref 
LD_SYS_LIBS = -lstdc++ -lsupc++ -lm -lc -lgcc -lnosys 


ifeq ($(DEBUG), 1) 
CC_FLAGS += -DDEBUG -O0 
else 
CC_FLAGS += -DNDEBUG -Os 
endif 

.PHONY: all clean lst size 

all: $(PROJECT).bin $(PROJECT).hex size 


clean: 
     rm -f $(PROJECT).bin $(PROJECT).elf $(PROJECT).hex $(PROJECT).map $(PROJECT).lst $(OBJECTS) $(DEPS) 


.asm.o: 
     $(CC) $(CPU) -c -x assembler-with-cpp -o [email protected] $< 
.s.o: 
     $(CC) $(CPU) -c -x assembler-with-cpp -o [email protected] $< 
.S.o: 
     $(CC) $(CPU) -c -x assembler-with-cpp -o [email protected] $< 

.c.o: 
     $(CC) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu99 $(INCLUDE_PATHS) -o [email protected] $< 

.cpp.o: 
     $(CPP) $(CC_FLAGS) $(CC_SYMBOLS) -std=gnu++98 -fno-rtti $(INCLUDE_PATHS) -o [email protected] $< 



$(PROJECT).elf: $(OBJECTS) $(SYS_OBJECTS) 
     $(LD) $(LD_FLAGS) -T$(LINKER_SCRIPT) $(LIBRARY_PATHS) -o [email protected] $^ -Wl,--start-group $(LIBRARIES) $(LD_SYS_LIBS) -Wl,--end-group 


$(PROJECT).bin: $(PROJECT).elf 
     $(OBJCOPY) -O binary $< [email protected] 

$(PROJECT).hex: $(PROJECT).elf 
     @$(OBJCOPY) -O ihex $< [email protected] 

$(PROJECT).lst: $(PROJECT).elf 
     @$(OBJDUMP) -Sdh $< > [email protected] 

lst: $(PROJECT).lst 

size: $(PROJECT).elf 
     $(SIZE) $(PROJECT).elf 

DEPS = $(OBJECTS:.o=.d) $(SYS_OBJECTS:.o=.d) 
-include $(DEPS) 

私は私の問題は、パス・エラーのいくつかの並べ替えだと思う... - _exitシンボルが定義されていますが、main.oがアクセスできない することができる - いくつかあるかもしれませんメイクファイルに重大なエラーがあります。私は行方不明です - 何か全く違うのですか?

この質問に対して推奨される変更についてはお気軽にコメントしてください。

EDIT:エラーを修正するために私がしなければならなかったのは、CFLAGSからCCFLAGSへの変更でした。解決策としてマークした答えは、何が起きているのかを説明し、それを修正する潜在的な方法でした。提案されたソリューションを使用する必要はありませんでしたが、なぜ機能していないのかの説明は有用であり、両方の答えによって提供される情報は有用です。

+0

? $ CFLAGSを定義しますが、そのAFAICSを決して参照しないでください。別のリンクステップを使用しようとしていますが、エラーに応じて、コンパイルステップで '-c'を渡していないようです。 – Notlikethat

+0

@Notlikethatそれは私の問題の一部でした。それを修正すると、他の無関係なエラーが発生しました。 –

答えて

1

_exitシンボルは定義できますが、main.oではアクセスできません - メイクファイルに重大なエラーがある可能性があります。

これは、標準ライブラリメソッドの呼び出しが間接的にexit()に依存する場合に発生します。ベアメタルアプリケーションで明らかに異なるセマンティクスを持つ、終了時にプロセスを中止するはずの、自動的に生成される例外のアンワインドコードからのものです。ゼロ除算浮動小数点例外はそのような例の1つです。 -fno-exceptionsはこれを助けません。

もちろん、何もしないでくださいexit()ハンドラを提供できますが、例外のアンワインドコードが最初に挿入されなかった場合、コードは小さくなります。

は、私はあなたがコンパイル単位で次のように、何も行わないバージョンの例外ハンドラを置き換えることができます生成されたアセンブラ調べることによって発見:

extern "C" void __wrap___aeabi_unwind_cpp_pr0() {} 
extern "C" void __wrap___aeabi_unwind_cpp_pr1() {} 
extern "C" void __wrap___aeabi_unwind_cpp_pr2() {} 

をして、これらの追加で、リンク時に代替品として、これらの内のリンクリンカーの引数。

-Wl,-wrap,__aeabi_unwind_cpp_pr0, 
-Wl,-wrap,__aeabi_unwind_cpp_pr1 
-Wl,-wrap,__aeabi_unwind_cpp_pr2 

もう1つの利点は、結果としてコードが縮小されることです。 MCUをリセットする独自の実装を挿入することもできます。

3

_exitはシステムコールであり、後で必要となる可能性がある他の機能です。 Linuxなどのバイナリをコンパイルすると、これらの呼び出しはオペレーティングシステムによって処理されます。ベアメタルの埋め込みプロジェクトでは、これらの機能を自分で定義する必要があります。一般的な方法は、syscalls.cなどのファイルを作成し、必要なシステムコールをそこに置くことです。このように急速グーグルで見つかったファイルの例を見てみましょう:あなたは正しくUARTで動作するように_read_writeを実装する場合、ボーナスとしてhttps://github.com/bjornfor/stm32-test/blob/master/STM32L1xx_StdPeriph_Lib_V1.1.1/syscalls.c

を、あなたはprintfscanfを経由してIOフォーマットしないことができるシリアルコンソールを取得します。

+0

迅速な対応に感謝します。あなたのアドバイスが役に立つと思うかもしれませんが、それは私の特別なケースでは解決策ではありませんでした。私はmbedがシステムコールを処理すると思います。 –

1

リンカオプションに--specs=nosys.specsを追加することでこの問題を解決することもできます。

nosys.specsファイルがコンパイラディレクトリのどこかにあることを確認すると、これが正確にわかります。

も参照してください:exit.c:(.text+0x18): undefined reference to `_exit' when using arm-none-eabi-gcc $ CC_FLAGSがあなたのメイクファイルでから来ている

関連する問題