Quiero crear un proyecto para la STM32F217IG microcontrolador.

Luego he instalado Eclipse y el GNU para el BRAZO incrustado GCC compilador cruzado. Creo que no es el Código Sourcery uno. Yo lo he utilizado, porque es compatible con punto flotante y el Código Sourcery no.

Una vez que lo hice, traté de crear realmente un proyecto pequeño con sólo dos fuentes de archivos: de prueba.c y principal.c con escrito sólo en dos de ellos:

#include <stdlib.h>
#include <stdio.h>

int main (void)
{
    printf("Hello, World!");
    return 0;
}

He cambiado la línea de comandos en la propiedad del proyecto para reemplazar GCC por arm-none-eabi-gcc y luego trató de compilar el proyecto.

Yo no crear cualquier archivo de mí mismo; he utilizado la creación automática de Eclipse.

El edificio parece estar bien, pero cuando se trata de la enlazador tengo los siguientes errores en la consola:

make all
'Building target: test3'
'Invoking: Cross GCC Linker'
arm-none-eabi-gcc  -o"test3"  ./main.o ./test3.o
c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-exit.o): In function `exit':
exit.c:(.text.exit+0x2c): undefined reference to `_exit'
c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text._sbrk_r+0x18): undefined reference to `_sbrk'
c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-writer.o): In function `_write_r':
writer.c:(.text._write_r+0x20): undefined reference to `_write'
c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-closer.o): In function `_close_r':
closer.c:(.text._close_r+0x18): undefined reference to `_close'
c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-fstatr.o): In function `_fstat_r':
fstatr.c:(.text._fstat_r+0x1c): undefined reference to `_fstat'
c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-isattyr.o): In function `_isatty_r':
isattyr.c:(.text._isatty_r+0x18): undefined reference to `_isatty'
c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-lseekr.o): In function `_lseek_r':
lseekr.c:(.text._lseek_r+0x20): undefined reference to `_lseek'
c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-readr.o): In function `_read_r':
readr.c:(.text._read_r+0x20): undefined reference to `_read'
collect2: ld returned 1 exit status
make: *** [test3] Erreur 1

Busqué en Internet, y he encontrado que puede ser una syscall problema. Pero no sé cómo puedo añadir esta biblioteca para mi proyecto en Linux.

Es lo que realmente es? Si sí, ¿cómo puedo solucionarlo? Y si no, ¿dónde los que vienen?

Como alguien sugirió, traté de «vinculación» C runtime library. En Eclipse me parece haber dos soluciones para hacerlo:

Primero en las propiedades del proyecto → C/C++ConstruirConfiguraciónCruz enlazadorbibliotecas. Acabo de añadir la letra c y, a continuación, el error no cambia, pero hay -lc al final de la línea de comandos:

 make all
'Building target: test3'
'Invoking: Cross GCC Linker'
arm-none-eabi-gcc  -o"test3"  ./main.o ./test3.o   -lc
c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-exit.o): In function `exit':
exit.c:(.text.exit+0x2c): undefined reference to `_exit'
c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-sbrkr.o): In function `_sbrk_r':
sbrkr.c:(.text._sbrk_r+0x18): undefined reference to `_sbrk'
c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-writer.o): In function `_write_r':
writer.c:(.text._write_r+0x20): undefined reference to `_write'
c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-closer.o): In function `_close_r':
closer.c:(.text._close_r+0x18): undefined reference to `_close'
c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-fstatr.o): In function `_fstat_r':
fstatr.c:(.text._fstat_r+0x1c): undefined reference to `_fstat'
c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-isattyr.o): In function `_isatty_r':
isattyr.c:(.text._isatty_r+0x18): undefined reference to `_isatty'
c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-lseekr.o): In function `_lseek_r':
lseekr.c:(.text._lseek_r+0x20): undefined reference to `_lseek'
c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-readr.o): In function `_read_r':
readr.c:(.text._read_r+0x20): undefined reference to `_read'
collect2: ld returned 1 exit status
make: *** [test3] Erreur 1

Pero no sé si es que realmente significa para agregar el C runtime library.

Segundo, he añadido la libc.una biblioteca en las propiedades del proyecto → C/C++ generalRuta y símbolosBibliotecas, y aquí es lo que me sale (completamente diferente):

make all
'Building target: test3'
'Invoking: Cross GCC Linker'
arm-none-eabi-gcc  -o"test3"  ./main.o ./test3.o   -l"C:/Program\ Files/GNU\ Tools\ ARM\ Embedded/4.6\ 2012q4/arm-none-eabi/lib/armv7-m/libc.a"
c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/bin/ld.exe: cannot find -lC:/Program\ Files/GNU\ Tools\ ARM\ Embedded/4.6\ 2012q4/arm-none-eabi/lib/armv7-m/libc.a
collect2: ld returned 1 exit status
make: *** [test3] Erreur 1

Entonces todavía no funciona, pero es una buena manera de buscar en?

Ah, y un hecho muy interesante:

Tengo los errores sólo en modo de depuración. Si estoy en modo de lanzamiento que todo está bien, y no tengo errores (excepto si puedo agregar la libc.entonces creo que este no es el bueno). ¿Eso significa que el problema es el .elfo de la creación del archivo?

  • El formato de las fuentes en algo legible, por favor! Proporcionar el vinculador de la línea de comandos, más detalles acerca de su cadena de herramientas (sólo puedo suponer que es de Código Sourcery/Mentor toolchain), etc.
  • He editado mi pregunta yo soy muy nuevo en todo eso yo no sé realmente la información que necesita para responder a la pregunta, si necesitas más me dicen que me va a editar de nuevo
  • Si citando a un nombre de archivo de los espacios no deben ser escapado: Así debe ser ... -l"C:/Program Files/GNU Tools ARM Embedded/4.6 2012q4/arm-none-eabi/lib/armv7-m/libc.a" o ... -lC:/Program\ Files/GNU\ Tools\ ARM\ Embedded/4.6\ 2012q4/arm-none-eabi/lib/armv7-m/libc.a
  • Ok, pero no sé cómo cambiarlo y de todos modos cuando leemos el error es: ld.exe: cannot find -lC:/Program\ Files/GNU\ Tools\ ARM\ Embedded/4.6\ 2012q4/arm-none-eabi/lib/armv7-m/libc.a que es tu segunda sugerencia, a continuación, creo que la línea de comandos tiene una buena sintaxis, incluso si no funciona no?
  • Dependiendo de su código, usted podría querer a punta de cabo esas funciones… Aquí están: extern «C» { void _exit( int status ) { while (1); } unsigned int _getpid() { return 0; } int _kill( int id, int sig ) { return 0; } void _sbrk( int id) {} int _fstat (int fd, void* buf) { return 0; } int _write( int fd, char *buf, int count ) { return 0; } int _más( int fd, char *buf, int count ) { return 0; } int _lseek( int fd, int count ) { return 0; } int _close( int fd ) { return 0; } int _isatty( int fd ) { return 0; } }
InformationsquelleAutor damien | 2012-11-05

5 Comentarios

  1. 29

    He mirado en la caja de herramientas que enlaza, sólo para leer el siguiente en la readme.txt:

    Este conjunto de herramientas está construido y optimizado para Cortex-R/M bare metal desarrollo.

    En otras palabras, este conjunto de herramientas está configurado específicamente para sistemas embebidos, quizás con ningún sistema operativo que se ejecuta en absoluto. En tal caso, no hay ningún sistema para proporcionar por ejemplo, la salida estándar donde printf() se supone que escribir, no hay ningún sistema de archivos, etc. – tienes el enlace en contra de algunos de la biblioteca de la prestación de estos servicios básicos, si usted quiere hacer uso de ellos.

    Que dijo, el kit de herramientas proporciona librdimon.a biblioteca que proporciona todos los servicios básicos. Esta biblioteca es en realidad una parte de libgloss de compilación. Si desea vincular en contra de ella, pruebe el siguiente comando:

    arm-none-eabi-gcc --specs=rdimon.specs   -Wl,--start-group -lgcc -lc -lm -lrdimon -Wl,--end-group -o test test.c

    Este vínculos muy bien en mi PC, pero si es lo que realmente quiere es otra historia (de donde se espera ver printf() de salida, de todos modos?).

    Para el chip que probablemente deberían buscar una biblioteca a la que redirige la salida estándar al puerto serie o proporciona depuración de salida a través de JTAG. Como alternativa, puede utilizar la función personalizada por ejemplo, el envío de la salida de depuración de la consola serie en lugar de printf() – le toca a usted.
    Si usted decide sobre el uso de printf() sugiero la lectura de libgloss documentación.

    También, sugiero buscar un conjunto de herramientas que está específicamente incluido para STM32 de la familia. Configurar correctamente todas esta cosas básicas (biblioteca de C, linker script, etc.) requiere un poco de experiencia.

    Edición: Muchos sistemas embebidos en realidad no uso de la biblioteca estándar de C, a partir prácticamente de cero. Si quieres ir de esta manera, debe pasar -nostdlib a su gcc invocación. Por supuesto, usted ya no tendrá cosas como printf() disponible.

    Edit 2: Otra manera es usar la biblioteca estándar (newlib, me refiero a) sin libgloss y proporcionar la adecuada talonarios para cosas que no necesita. Es posible que desee seguir este tutorial, donde _read y _write se implementa a través del puerto serie, y todo lo demás es auxiliar. Esto es más probable que lo que usted realmente desea.

    • Gracias por tu respuesta, incluso si no tengo a donde debo hacer este comando en eclipse. Por casualidad alguien sabe si hay un conjunto de herramientas específicamente empaquetados para STM32 de la familia?
    • Para responder a tu pregunta yo no esperaba ver a printf() en cualquier lugar. Sólo estoy tratando de hacer un proyecto sencillo y compilar y vincular a estar seguro de que este conjunto de herramientas se pueden usar posteriormente para mi proyecto. Por cierto, si es una biblioteca problema ¿por qué obtengo el error sólo en modo de depuración y no en modo de lanzamiento?
    • Ya que aunque se acerca printf acabo de comentar a todos, tanto printf en mi proyecto y he aquí lo que sucede: todavía tengo error, incluso si es sólo uno: 'Building target: test3' 'Invoking: Cross GCC Linker' arm-none-eabi-gcc -o"test3" ./main.o ./test3.o c:/program files/gnu tools arm embedded/4.6 2012q4/bin/../lib/gcc/arm-none-eabi/4.6.2/../../../../arm-none-eabi/lib\libc.a(lib_a-exit.o): In function exit': exit.c:(.text.exit+0x2c): undefined reference to _exit' collect2: ld returned 1 exit status make: *** [test3] Erreur 1 Que es exactamente el mismo error que la primera me dieron antes de
    • Bueno, no exactamente, yo diría – ¿todavía se quejan por ejemplo,_write()? De todos modos, _exit() es también una parte de libgloss referencia de newlib, deberá proporcionar algunos de implementación, o dar con la biblioteca estándar. Me dejaba actualizar mi respuesta.
    • En realidad me las arreglé para agregar el rdimon biblioteca y enlaces bien. Muchas gracias. Yo justo ahora necesitan ser capaces de generar un fichero elf que no es el caso en la actualidad, y no sé por qué
    • Ver mi última actualización, creo que es el mejor punto de partida para usted.

  2. 9

    Sé que esto es una vieja pregunta, pero me encontré con esto hoy en día cuando se trata de construir para un STM32 de la junta. El proyecto que tengo tiene algunos enlazador de secuencias de comandos (específicamente libs.ld). Adición de una entrada para libnosys.en este satisfecho el enlazador y yo era capaz de seguir.

    libs.ld:

     GROUP(
    libgcc.a
    libg.a
    libc.a
    libm.a
    libnosys.a
    )
    • Funciona como un encanto, gracias!
    • ‘GRUPO (libnosys.a) las obras de bien.
    • Es importante entender que nosys talones de casi todo – por lo tanto HelloWorld por encima de la voluntad de compilación y enlace, pero no hará nada, como e/S de archivo es auxiliar así.
  3. 6

    De ahorro de su programa de C como «myprint.c», puedo compilar de la siguiente manera:

    arm-none-eabi-gcc myprint.c -lc -especificaciones=nosys.especificaciones

    Sin errores y la salida de multa.

  4. 3

    También hubo un problema con malloc() y free() llamadas de función en el proyecto de Eclipse. He escrito firmware para un microcontrolador STM32 utilizando Eclipse + GNU para el BRAZO incrustado GCC compilador cruzado + STM32CubeMX para el microcontrolador de la periferia de la inicialización y el linker script de decisiones.

    Cuando he añadido faltan las cadenas de libg.a ( * ) y libnosys.a ( * ) en el DESCARTAR sección de .ld script, mi proyecto era construir con éxito.

  5. 0

    Que yo había creado un RTOS proyecto con CubeMX y añadido un printf y tenía el mismo problema en la vinculación, mientras que la depuración con OpenOCD.

    He sustituido las printf(«Hola BRAZO Mundo!») con trace_puts(«Hola BRAZO Mundo!»); y
    tenía los mensajes aparecen en la consola de depuración.

Dejar respuesta

Please enter your comment!
Please enter your name here