Forum: Mikrocontroller und Digitale Elektronik Wie erstelle ich eine lib*.a Datei?


von Tobias E. (doenges2)


Lesenswert?

Hallo,

ich möchte die Libary lib_AT91SAM7S256.h in mein Projekt einfügen und 
bekommen folgene Fehlermeldung von GNU:

make -k all
.compiling
arm-elf-gcc -I./ -c -fno-common -O0 -g lib_AT91SAM7S256.h
lib_AT91SAM7S256.h:55: error: expected ')' before 'pAic'
lib_AT91SAM7S256.h:84: error: expected ')' before 'pAic'
lib_AT91SAM7S256.h:96: error: expected ')' before 'pAic'
.
.
.
.

das geht eine ganze Weile so weiter!

meine Makefile sieht im übrigen so aus:

NAME = test

# variables
CC      = arm-elf-gcc
LD      = arm-elf-ld -v
AR      = arm-elf-ar
AS      = arm-elf-as
CP      = arm-elf-objcopy
OD  = arm-elf-objdump

CFLAGS  = -I./ -c -fno-common -O0 -g
AFLAGS  = -ahls -mapcs-32 -o crt.o
LFLAGS  =  -Map main.map -Ttest123.cmd
CPFLAGS = --output-target=binary
ODFLAGS  = -x --syms

OBJECTS = crt.o  main.o button2isr.o isrsupport.o lowlevelinit.o 
lib_AT91SAM7S256.o ioat91sam7s256.o


# make target called by Eclipse (Project -> Clean ...)
clean:
  -rm $(OBJECTS) crt.lst main.lst main.out main.bin main.hex main.map 
main.dmp


#make target called by Eclipse  (Project -> Build Project)
all:  main.out
  @ echo "...copying"
  $(CP) $(CPFLAGS) main.out main.bin
  $(OD) $(ODFLAGS) main.out > main.dmp

main.out: $(OBJECTS) test123.cmd
  @ echo "..linking"
  $(LD) $(LFLAGS) -o main.out $(OBJECTS) libc.a libm.a libgcc.a

crt.o: crt.s
  @ echo ".assembling"
  $(AS) $(AFLAGS) crt.s > crt.lst

main.o: main.c
  @ echo ".compiling"
  $(CC) $(CFLAGS) main.c

button2isr.o: button2isr.c
  @ echo ".compiling"
  $(CC) $(CFLAGS) button2isr.c

isrsupport.o: isrsupport.c
  @ echo ".compiling"
  $(CC) $(CFLAGS) isrsupport.c

lowlevelinit.o: lowlevelinit.c
  @ echo ".compiling"
  $(CC) $(CFLAGS) lowlevelinit.c

lib_AT91SAM7S256.o: lib_AT91SAM7S256.h
  @ echo ".compiling"
  $(CC) $(CFLAGS) lib_AT91SAM7S256.h

ioat91sam7s256.o: ioat91sam7s256.h
  @ echo ".compiling"
  $(CC) $(CFLAGS) ioat91sam7s256.h




------------------------------------------------------------------------ 
-
# specify output filename here (must be *.bin file)
TARGET = main.bin

# specify the directory where openocd executable and configuration files 
reside
OPENOCD_DIR = 'c:/Programme/openocd-2007re141/bin/'

# specify OpenOCD executable (pp is for the wiggler, ftd2xx is for the 
USB debuggers)
#OPENOCD = $(OPENOCD_DIR)openocd-pp.exe
OPENOCD = $(OPENOCD_DIR)openocd-ftd2xx.exe

# specify OpenOCD configuration file (pick the one for your device)
#OPENOCD_CFG = $(OPENOCD_DIR)at91sam7s256-wiggler-flash-program.cfg
#OPENOCD_CFG = $(OPENOCD_DIR)at91sam7s256-jtagkey-flash-program.cfg
OPENOCD_CFG = $(OPENOCD_DIR)at91sam7s256-armusbocd-flash-program.cfg

# program the AT91SAM7S256 internal flash memory
program: $(TARGET)
  @echo "Flash Programming with OpenOCD..."      # display a message on 
the console
  $(OPENOCD) -f $(OPENOCD_CFG)            # program the onchip FLASH 
here
  @echo "Flash Programming Finished."          # display a message on 
the console



Die Datei ioat91sam7s256.h benötigt die lib_AT91SAM7S256.h selbst!

Bei dem Versuch es händisch mit GNu zu machen....kommt das gleiche raus!
Die lib*.h muß doch erst eine lib*.a Datei werden und dann kann es eine 
lib*.o Datei werden, richtig?

Nur wie wird es eine lib*.a Datei

von Hugo Mildenberger (Gast)


Lesenswert?

Eine .h -Datei ist eine Header Datei der Sprache "C" Darin stehen Daten- 
und Prototypen von andernorts definierten Funktionen. Eine .h Datei wird 
normalerweise nicht eigenständig in eine object-Datei (.o) kompiliert, 
erst recht nicht in eine Liste von object-Dateien, was eine library (.a) 
darstellt.

Wenn man eine Library  verwenden will, verwendet man die 
entsprechende(n)Header-Datei(en) per #include - Anweisung im eigenen 
Quelltext und bindet die Bibliothek per Linker-Anweisung mit dem eigenen 
Programm zusammen, indem  ( beim GNU -ld)  außer den Namen der selbst 
erzeugten Objekt-Dateien der Name der Bibliothek mittels "-l" auf dessen 
Befehlzeile angegeben wird (ld --help erklärt den Rest. Aus 
irgendwelchen Gründen bewirkt die Angabe "ld -ldns" die Einbindung der 
Bibliothek libdns, die angabe des Präfix "lib" spart man sich also.)

von Tobias E. (doenges2)


Lesenswert?

Guten Morgen,

durch deinen Tip habe ich versucht ersteinmal eine .o Datei zu bekommen, 
denn nur die versteht der gnu -ld.

Wenn ich nun mit meiner Datei arm-elf-gcc (arm-elf-gcc 
lib_AT91SAM7S256.h) versuche daraus eine .o Datei zu erstellen, bekomme 
ich nur zu lesen das ganz viel Funktionen nicht deklariert sind!
versuche ich das Ganze mit dem Zusatz -S (arm-elf-gcc -S 
lib_AT91SAM7S256.h)
dann sagt er mir das die "output filename are specified twice"

Die Aussage verstehe ich aber nicht, hast du einen Tip?

Gruß

Tobi

von mthomas (Gast)


Lesenswert?

Zumindest die lib_AT91SAM7S256.h, die ich kenne, ist keine Library im 
Sinne von einer Sammlung von Objectcode und auch nicht dazu gedacht, 
eine solche daraus zu machen. Die darin enthaltenen Funktionen sind zu 
Verwendung als Inline-Funktionen gedacht. Damit es bei gcc wie 
beabsichtigt funktioniert:
1
#define __inline static inline
2
#include "lib_AT91..."

Martin Thomas

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.