Statische Bibliothek linken

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
Columbus
Beiträge: 1051
Registriert: 30.04.2002 15:25:02
Wohnort: Mainz
Kontaktdaten:

Statische Bibliothek linken

Beitrag von Columbus » 09.05.2006 19:55:28

Hallo zusammen,
ich habe noch ein anderes Problem. Und zwar versuche ich gerade mit ar eine statische Bibliothek zu erzeugen und zum Hauptprogramm dazuzulinken.

Also ich habe folgendes Beispiel C-Funktionen:

Code: Alles auswählen

#include <mytest.h>

int hallo ( void )
{
   printf ("Hallo\n");
   return ( 0 );
}

int sonstwas (void)
{
   printf ("Sonstwas\n");
   return ( 0 );
}
Dazu habe ich noch eine passende Headerdatei und ein Hauptprogramm, die lasse ich hier mal weg.
Das ganze compliere ich mit:

Code: Alles auswählen

 gcc -Wall -c -I. mytest.c 
So bekomme ich eine Objektdatei. mytest.o
Diese wandele ich mit ar -r libmytest.a mytest.o zu einem Archiv oder einer statischen Bibliothek. Mein Hauptprogramm heist haupt.o und ist auch eine Objektdatei.
Mit

Code: Alles auswählen

 ld haupt.o libmytest.a 
sollte eigentlich dauraus ein lauffähiges Programm zusammen gelinkt werden. Ich bekomme aber nur Fehlermeldungen über unrefferenzierte Funktionen.
Irgendwas habe ich vergessen, aber leider kann ich mich nicht mehr erinnern was es ist. Die Google-Ergebnisse geben mir auch nichts brauchbares, normalerweiße nimmt man ja auch dynamische Bibliotheken.

Ich hoffe hier kann mir jemand helfen

Gruss Christian
Die größten Kritiker der Elche,
waren früher selber welche.

F.W. Bernstein

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 09.05.2006 20:13:19

1. nach ar muss noch ranlib aufgerufen werden
2. statt ld haupt.o libxxxx.a versuch mal "ld haupt.o -L/pfad/zur/lib -lxxxx"
ansonsten nimm gcc: "gcc haupt.o libxxxx.a"

Schau dir aber mal am besten automake in verbindung mit libtool, oder - meiner Meinung nach besser - SCons an. Das übernimmt den ganzen Mist für dich. Und im Falle von SCons läuft es auch unter Windows.

z.B. sähe das SConstruct für dein Beispiel so aus

Code: Alles auswählen

lib = StaticLibrary("mytest.c")

Program("haupt.c", LIBS=lib)

Benutzeravatar
Columbus
Beiträge: 1051
Registriert: 30.04.2002 15:25:02
Wohnort: Mainz
Kontaktdaten:

Beitrag von Columbus » 09.05.2006 20:23:13

Hallo Joghurt,
das Problem habe ich inzwischen gemeistert. Ich muß einfach

Code: Alles auswählen

ar crs libmytest.a mytest.o
eingeben. Dann

Code: Alles auswählen

 gcc -o haupt main.c -L. -I. -lmytest
Ich muß morgen einen Test bestehen an einem Rechner, wo ich glaube, ranlib nicht ausführen darf. Also den Compiler immer auf das aktuelle Verzeichnis hinweißen.

So scheints zu gehen.

Aber vielen Dank nochmal...

Gruss Christian
Die größten Kritiker der Elche,
waren früher selber welche.

F.W. Bernstein

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 09.05.2006 20:26:24

Columbus hat geschrieben:Ich muß morgen einen Test bestehen an einem Rechner, wo ich glaube, ranlib nicht ausführen darf.
Das wäre bekloppt:
man ar hat geschrieben: s
Write an object-file index into the archive, or update an existing one, even if no other change is made to the archive. You may use this modifier flag either with any operation, or alone. Running ar s on an archive is equivalent to running ranlib on it.

Benutzeravatar
Columbus
Beiträge: 1051
Registriert: 30.04.2002 15:25:02
Wohnort: Mainz
Kontaktdaten:

Beitrag von Columbus » 09.05.2006 21:52:58

Naja, ich fände es auch sinnvoller, wenn wir dynamische '.so'-Libs erzeugen würden. Wie oft wird heute noch Bibliotheken mit ar erzeugt?
Die größten Kritiker der Elche,
waren früher selber welche.

F.W. Bernstein

Antworten