2013-10-17 8 views
25

Sono nuovo nel campo dei microcontrollori. Ho bisogno di portare un IDE che sta compilando programmi per microcontrollori AVR per compilare programmi per microcontrollori ARM. Ho appena sostituito il compilatore da AVR a ARM e ho aggiunto alcune opzioni come detto da qualcuno. Quello che segue è il comando:exit.c :(. Testo + 0x18): riferimento non definito a `_exit 'quando si utilizza arm-none-eabi-gcc

\ARM-GCC\bin\arm-none-eabi-gcc -O0 -ffunction-sections -Wall -std=gnu99 -mfloat-abi=soft 
-Wa,-adhlns="[email protected]" -fmessage-length=0 -mcpu=cortex-m0 -mthumb -g3 -gdwarf-2 -Wl, 
--gc-sections -o <Dir_name>\Build_Files\Blink_arm.cpp.elf <Dir_name>\Build_Files\Blink_arm.cpp.o <Dir_name>\Build_Files\core.a 
-L<Dir_name>\Build_Files -lm 

Quando eseguo io ottenere l'errore follwing:

tools/arm-gcc/bin/../lib/gcc/arm-none-eabi/4.6.2\libc.a(lib_a-exit.o): In function `exit': 
exit.c:(.text+0x18): undefined reference to `_exit' 
collect2: ld returned 1 exit status 

Posso avere un aiuto su ciò che è questo errore e come posso risolverlo. E anche io non so quali specificano quelle opzioni nella riga di comando.

+3

nella vostra ARM libc (che è in bundle con il compilatore), la funzione 'exit()' effettua una chiamata a '_exit()', che non è definita in nessuna libreria. il tuo compilatore deve essere impostato in modo errato, sebbene tu possa eseguire una correzione rapida definendo 'void _exit (int status)' tu stesso (NOTA: questo non funzionerà se la tua libc dichiara _exit() con una firma diversa. "Potrebbe semplicemente fermarsi in un ciclo infinito come la sua controparte AVR, correggere l'installazione di GCC sarebbe l'opzione raccomandabile – Dylan

+1

Vedere: [newlib syscalls] (https://sourceware.org/newlib/libc.html#Syscalls); è necessario implementarli, se non sono implementati per la tua board.Inoltre, ci possono essere problemi con il tuo codice. Newlib non supporta tutto, vedi [Newlib di Gatliff] (http://www.billgatliff.com/newlib.html) panoramica. –

risposta

37

Ciò accade quando si compila un file con arm-none-eabi-gcc in una macchina/architettura per caricarlo in un AR M macchina di destinazione. Molto probabilmente non stai facendo uso del semihosting, vuoi retargetare.

ARM® Compiler toolchain versione 4.1 indica:

Semihosting is a mechanism that enables code running on an ARM target to communicate and use the Input/Output facilities on a host computer that is running a debugger.

Dal readme.txt della toolchain (sotto la cartella .../gcc-arm-none-eabi-VERSION/share/doc/gcc-arm-none-eabi):

** non-semihosting/retarget

If you are using retarget, linking like: $ arm-none-eabi-gcc --specs=nosys.specs $(OTHER_LINK_OPTIONS)

Per me --specs=nosys.specs stato abbastanza;)

Problemi correlati