Forum: Compiler & IDEs Linken von mehreren Objekten und Bibliotheken


von Markus (Gast)


Lesenswert?

Moin,

erstmal vielen Dank für die vielen Beiträge zu meinen bisherigen Fragen 
und Problemen. So langsam arbeite ich mich durch. Trotzdem habe ich noch 
ein Problem:

Ich möchte mein Programm modular aufbauen und den Code daher in mehreren 
C-Dateien unterbringen. Einige von diesen C-Dateien sollen vor dem 
Link-Vorgang noch in eine Bibliothek zusammen gefasst werden. Dazu habe 
ich folgende Fragen:

1. Ist es richtig, dass ich eine Bibliothek mit avr-ar.exe erstellen 
kann und die dann die Endung .a hat?
2. Ist es richtig, dass ich den Linker avr-ld.exe benutzen muss?
3. Wie kann ich dem Linker sagen, dass die Objekt-Dateien und 
Bibliotheken, die er verwenden soll (wegen der Übersicht) in einer extra 
Datei notiert sind? Der Linker soll also eine Datei einladen (z.B. 
link.dat) in der dann alle Objekte und Libs aufgeführt sind.
4. Wie sieht dann so eine Datei aus? Hat das was mit diesen Scripten 
(-T) zu tun?
5. Was wirft der Linker dann aus und wie mache ich daraus ein Hex-File?

Ich danke Euch !

Markus

von Joerg Wunsch (Gast)


Lesenswert?

1) ja
2) jein, laß besser den C-Compiler das Linken anschieben
3) gar nicht (m. W.), nimm ein Makefile und führe die einzelnen
   Dateinamen auf
4) n. zutr./ Linker scripts kannst Du im Manual nachlesen
   (genauer: in den info pages), sie beschreiben die Zuordnung
   der linker sections im Ergebnis
5) ein ELF file, avr-objcopy

Aber warum schaust Du Dir nicht die Beispiel-Makefiles an?
3 und 5 erledigen sich eigentlich damit.

Hinweis: aus Bibliotheken werden nur die Objektdateien entnommen,
die zum Auflösen einer bisher ungelösten externen Referenz
dienen.  Auf der Kommandozeile angegebene .o Dateien werden
dagegen immer vollständig gelinkt.  Aus Bibliotheken werden
immer komplette Objektdateien eingebunden (oder eben nicht),
nicht etwa einzelne Funktionen.  Sinnvollerweise schreibt
man also pro Funktion eine Quelldatei (sofern nicht gerade
Funktionen untrennbar miteinander verbunden sind).

von Markus (Gast)


Lesenswert?

Hallo Jörg,

vielen Dank.
Genau das ist es eben, warum ich das so machen will. Ich habe inzwischen 
viel Erfahrung mit größeren Controllern (C167 Infineon). Und die darauf 
laufenden Applikationen sind so umfangreich, daß ich einzelne Module in 
Unterordnern programmiere. Und genau aus den genannten Gründen 
programmiere ich jede Funktion in eine einzelne Datei, es sei denn, sie 
rufen sich gegenseitig auf und werden daher eh beide benötigt. Diese 
vielen kleinen C-Dateien compiliere ich dann und lasse eine Bibliothek 
erstellen. Somit werden später aus dem Modul nur die benötigen 
Funktionen eingebunden. Die Bibliotheken werden dann in einen extra 
Ordner für den Linker-Vorgang kopiert. Lediglich die Objekt-Datei, die 
die main-Fkt enthält, linke ich direkt als Obj-Datei dazu, damit der 
Linker den Einsprung findet. Und das Versuche ich nun für den Atmel 
nachzubilden. Leider noch ohne erfolg. Mit den Makefiles komme ich noch 
nicht so zu recht, weil ich bislang die Syntax der Datei nicht verstehe. 
Darum habe ich mich erstmal um die Schalter und Optionen des Compilers 
und des Linkers gekümmert. Könntest Du mir vielleicht mal ein kleines 
Makefile generieren, daß zwei C-Dateien kompiliert und in einer 
Bibliothek zusammen faßt?

Thanx
Markus

von Joerg Wunsch (Gast)


Lesenswert?

Das folgende Makefile verläßt sich ziemlich stark auf das
eingebaute Wissen von »make«.  Versuche es mal bei
Gelegenheit, anhand der Doku zu verstehen.  Getestet mit
BSD make und GNU make, müßte eigentlich auch mit SysV make
gehen. ;-)

Statt Kopieren der Zielbibliothek ist es effektiver, den
anderen Jobs ein -L<verzeichnisname> mit auf den Weg zu
geben.  Mit untenstehender Namenswahl kannst Du die erzeugte
Bibliothek dann mit -lmyutils linken lassen.

CC=avr-gcc
AR=avr-ar
RM=rm -f
CFLAGS=-mmcu=at90s8515 -O # was auch immer Du noch brauchst

MYLIB=libmyutils.a
SRCS=foo.c bar.c
OBJS=${SRCS:.c=.o}

all: ${MYLIB}

${MYLIB}: ${OBJS}
  ${AR} ${ARFLAGS} ${MYLIB} $?
# ^^^ das hier muß ein TAB sein.

clean:
  ${RM} ${OBJS} ${MYLIB}
# ^^^ das auch

von Joerg Wunsch (Gast)


Lesenswert?

Hmm, die TABs kommen nicht sehr gut hier.  Daher nochmal:
vor den ${AR} und ${RM} muß ein TAB stehen, keine
Leerzeichen.  Alles andere als derartige Kommandos gehört in
einem Makefile nicht mit TABs eingerückt (da man Leerzeichen
leicht mit TABs verwechselt, rückt man alles andere am besten
gar nicht ein).

von Oryx (Gast)


Angehängte Dateien:

Lesenswert?

hallo markus,

das mit den bibliotheken könnte wie von jörg vorgeschlagen 
funktionieren.

aber der sinn ist mir noch nicht klar.

ich habe einmal eine makedatei angehangen, die drei dateien kompiliert.
es werden nur die dateien kompiliert und eingebunden, die ab zeile 12 
eingetragen sind. das sollte in etwa das sein, was du brauchst.
die verzeichnisse hänge ich gezipt an.

du musst in verz_main nur make aufrufen.

das ergebnis ist verz_main.bin, mit dem format srec.
obj_copy kann aber auch binary, daher meine bezeichnung *.bin


die dateien stehen in unterschiedlichen verzeichnissen.

alle zwischendateien stehen in einem extra verzeichnis.

zum kopieren wird cp von cygwin verwendet, evtl. ändern.

wenn du kein laufwerk d: zur verfügung hast, musst du die pfade noch 
ändern.

sollte das alles nicht ganz klar sein, sende doch bitte ein paar 
dateien, die kompiliert werden sollen.

ist leider etwas spät geworden, ich hoffe, das ich mich halbwegs 
verständlich ausdrücken konnte.

ORYX

von Markus (Gast)


Lesenswert?

Hallo,

kann mir eigentlich noch mal eben jemand sagen, wie ich diesen Fehler 
töten kann:

 warning: no newline at end of file

????

Danke. Das nervt nämlich!

Markus

von Joerg Wunsch (Gast)


Lesenswert?

Ja, die Datei mit einer vollständigen Zeile beenden. ;-)
D. h., wenn Du mit dem Cursor an das Ende der Datei gehst,
muß der auf einer leeren Zeile für sich stehen, nicht etwa
am Ende der letzten Zeile, die noch andere Zeichen enthält.

von BAB (Kai K.) (Gast)


Lesenswert?

den sinn habe ich auch noch nie verstanden..:)

von Joerg Wunsch (Gast)


Lesenswert?

Welchen Sinn?  Daß man vollständige Zeilen schreibt?  Das ist
außerhalb der Wintel-Welt schlicht üblich. ;-)

von Joerg Wunsch (Gast)


Lesenswert?

Wenn mich nicht alles täuscht, schreibt der C-Standard sogar
vor, daß ein C-Programm aus Zeilen besteht.  Folglich ist ein
fehlendes Newline am Ende strikt genommen ein Syntaxfehler.

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.