Sie haben Code geschrieben. Es funktioniert. Aber jetzt möchten Sie diesen „rand()“-Generator oder diese „bubble_sort“-Routine in einem völlig anderen Projekt verwenden. Das Einfügen von Kopien ist faul. Es ist auch spröde. Wenn Sie eine Version aktualisieren, müssen Sie jede Kopie des Codes aufspüren.
Der berufliche Schritt? Bauen Sie eine Bibliothek.
Im C-Ökosystem ist eine Bibliothek keine magische Blackbox. Es sind nur zwei Akten mit unterschiedlichen Aufgaben. Sie benötigen eine Header-Datei (.h ) und eine Quelldatei (.c ). Der Header teilt dem Rest der Welt mit, welche Funktionen vorhanden sind. Die Quelldatei erledigt tatsächlich die Arbeit.
Aufbau der Schnittstelle: util.h
Die Header-Datei fungiert als Vertrag. Es enthält nicht die Logik. Es enthält die Versprechen. Konstanten, Typen und Funktionsprototypen.
Erstellen Sie eine Datei mit dem Namen util.h.
„c
/ util.h /
extern int rand();
extern void bubble_sort(int, int []);
„
Diese „externen“ Schlüsselwörter leisten Schwerstarbeit. Sie sagen dem Compiler: „Suchen Sie hier nicht nach der Implementierung. Ich werde sie später beim Verlinken finden.“ Wenn Sie auf einem älteren Compiler feststecken, der älter ist als moderne C-Standards, entfernen Sie die Parameter aus „bubble_sort“. Alte Compiler sind so wählerisch.
Die Maschinerie verstecken: util.c
Nun zum eigentlichen Code. Speichern Sie dies als util.c.
„c
/ util.c /
int rand_seed = 10; / von K&R – erzeugt eine Zufallszahl zwischen 0 und 32767. /
int rand() {
rand_seed = rand_seed * 1103515245 + 12345;
return (unsigned int)(rand_seed / 65536) % 32768;
}
void bubble_sort(int m, int a[]) {
int x, y, t;
für (x = 0; x < m - 1; x++)
für (y = 0; y < m - x - 1; y++)
if (a[y] > a[y + 1]) {
t = a[y];
a[y] = a[y + 1];
a[y + 1] = t;
}
}
„
Beachten Sie die Include-Direktive. Wir verwenden Anführungszeichen („util.h“`) anstelle von spitzen Klammern („
Hier ist der subtile Teil: „rand_seed“. Es befindet sich in „util.c“. Es ist nicht in util.h. Das sind Informationen, die sich in Aktion verstecken. Code, der diese Bibliothek verwendet, kann „rand()“ aufrufen, aber den Seed nicht direkt berühren. Der Staat ist gekapselt. Für eine strikte Durchsetzung können Sie das Schlüsselwort „static“ vor die Variablendefinition setzen. Das schließt es fest ab. Kein externer Zugriff. Zeitraum.
Verwenden der Bibliothek: main.c
Schreiben Sie nun das Programm, das es verwendet. Speichern Sie dies als main.c.
„c
int a[MAX];
void main() {
int i, t, x, y;
/ Array füllen /
für (i = 0; i < MAX; i++) {
a[i] = rand();
printf("%d\n", a[i]);
}
bubble_sort(MAX, a);
/ sortiertes Array drucken /
printf(“——————–\n”);
für (i = 0; i < MAX; i++)
printf("%d\n", a[i]);
}
„
Kürzer? Ja. Reiniger? Absolut. Dem Hauptprogramm ist es egal, wie „rand()“ Zahlen generiert. Es erfordert lediglich eine Nummer. Diese Trennung ist der springende Punkt.
Kompilieren und Verknüpfen
Wie wandeln Sie diese separaten Dateien in eine laufende ausführbare Datei um? Sie folgen dem Drei-Schritte-Tanz.
Kompilieren Sie zunächst die Bibliotheksquelle in eine Objektdatei. Angenommen, Sie befinden sich auf einem UNIX-ähnlichen System, das GCC verwendet:
„Bash
gcc -c -g util.c
„
Das Flag „-c“ ist hier nicht verhandelbar. Es weist den Compiler an, nach der Erstellung der Objektdatei anzuhalten. Es erstellt util.o. Diese Datei enthält Maschinencode, ist jedoch unvollständig. Es hat keine „Haupt“-Funktion. Es kann nicht alleine laufen. Es ist eine Komponente, kein Produkt.
Als nächstes kompilieren Sie Ihr Hauptprogramm:
„Bash
gcc -c -g main.c
„
Dadurch wird main.o generiert. Wieder nur Maschinencode. Ohne die Logik der Bibliothek stecke ich immer noch fest.
Verknüpfen Sie sie schließlich miteinander.
„Bash
gcc -o main main.o util.o
„
Dieser Befehl nimmt beide Objektdateien und fügt sie zu einer einzigen ausführbaren Datei mit dem Namen „main“ zusammen. Jetzt haben Sie ein vollständiges Programm. Führen Sie es mit „./main“ aus (oder einfach „main“, wenn Sie Windows verwenden oder es in Ihrem Pfad haben).
Es sind viele Schritte für zwei Funktionen. Aber stellen Sie sich vor, Sie würden dies für ein Projekt mit fünfzig Dateien tun. Sie kompilieren jede „.c“-Datei einmal. Sie verknüpfen sie miteinander. Eine Funktion in der Bibliothek ändern? Kompilieren Sie nur diese Datei neu. Neu verknüpfen. Der Rest bleibt unangetastet.
Makefiles automatisieren dies

























