Wie erstelle ich eine statische Bibliothek mit g ++?


101

Kann mir bitte jemand sagen, wie man eine statische Bibliothek aus einer CPP- und einer HPP-Datei erstellt? Muss ich die .o und die .a erstellen? Ich möchte auch wissen, wie ich eine statische Bibliothek kompilieren und in anderem CPP-Code verwenden kann. Ich habe header.cpp, header.hpp .ich möchte erstellen header.a. Testen Sie den Header.a in test.cpp. Ich benutze g ++ zum Kompilieren.


3
Können Sie bitte die Antwort von @ NeilButterworth (oder eine andere) akzeptieren?
Einpoklum

Antworten:


109

Erstellen Sie eine O-Datei:

g++ -c header.cpp

Fügen Sie diese Datei einer Bibliothek hinzu und erstellen Sie gegebenenfalls eine Bibliothek:

ar rvs header.a header.o

Bibliothek benutzen:

g++ main.cpp header.a

3
g ++ test.cpp header.a -o test, nein?
LinuxX

11
@unapersson: Warum? Die ausführbare Datei ist nicht im a.outFormat , so dass dies sehr irreführend ist. Und warum sollten Sie "nie" eine ausführbare Datei namens erstellen test?
Leichtigkeitsrennen im Orbit

5
@Tomalak Geret'kal: Ich denke, das hat damit zu tun, dass testes sich um einen Systembefehl handelt. Aber da Testprogramme normalerweise nie im System-Bin-Verzeichnis installiert sind und Sie schreiben müssen ./test, ist dies auch für mich kein so großes Problem ...
ereOn

10
@unapersson: Nein. Ich sage genau das, was ich gesagt habe. Ausführbare Dateien werden nicht mehr im a.outFormat erstellt, der Name bleibt jedoch aus alten Gründen erhalten. (Und wenn Sie nicht in der Lage sind, eine Shell richtig zu verwenden, dann ist das Ihr Problem. Ich weiß, wie man eine ausführbare Datei aus dem aktuellen Verzeichnis ausführt. Für einen ausführbaren Namen testist das in Ordnung , solange Sie nur einen kurzen Test schreiben Ausschnitt natürlich.)
Leichtigkeitsrennen im Orbit

4
Das Benennen einer ausführbaren Datei testist etwas, das ich schwer zu bereuen gelernt habe und das "perfekt in der Lage ist, eine Shell zu verwenden". Es ist eine schlechte Idee, und ich habe gesehen, dass sie viele andere beißt, die "perfekt in der Lage sind, eine Muschel zu benutzen".
Präsident James K. Polk

46

Sie können eine .aDatei mit dem arDienstprogramm wie folgt erstellen :

ar crf lib/libHeader.a header.o

libist ein Verzeichnis, das alle Ihre Bibliotheken enthält. Es wird empfohlen, den Code auf diese Weise zu organisieren und den Code und die Objektdateien zu trennen. Alles in einem Verzeichnis zu haben, sieht im Allgemeinen hässlich aus. Die obige Zeile wird libHeader.aim Verzeichnis erstellt lib. Führen Sie in Ihrem aktuellen Verzeichnis folgende Schritte aus:

mkdir lib

Führen Sie dann den obigen arBefehl aus.

Wenn Sie alle Bibliotheken verknüpfen, können Sie dies folgendermaßen tun:

g++ test.o -L./lib -lHeader -o test  

Das -LFlag kann g++das lib/Verzeichnis zum Pfad hinzufügen . Auf diese Weise g++wissen Sie, nach welchem ​​Verzeichnis Sie suchen müssen libHeader. -llibHeaderkennzeichnet die zu verknüpfende Bibliothek.

wo test.o so erstellt wird:

g++ -c test.cpp -o test.o 

2
und was ist mit lib / libHeader.a? ar rcs ... ist es nicht besser als ar crf?
LinuxX

1
@linuxx: main.o wird die Objektdatei sein, die Sie aus main.cc erstellen
Sriram

@linuxx: Die genauen Flags, die Sie mit dem Dienstprogramm ar verwenden, sind Ihre Entscheidung basierend auf Ihren Anforderungen. Es wäre eine gute Idee, die Manpages nach ar zu durchsuchen.
Sriram

Wie teste ich die Bibliothek mit test.cpp?
LinuxX

19
Wäre es nicht -lHeaderstattdessen -llibHeader?
Dolanor

30

Kann mir bitte jemand sagen, wie man eine statische Bibliothek aus einer CPP- und einer HPP-Datei erstellt? Muss ich die .o und die .a erstellen?

Ja.

Erstellen Sie die .o (wie gewohnt ):

g++ -c header.cpp

Erstellen Sie das Archiv :

ar rvs header.a header.o

Test :

g++ test.cpp header.a -o executable_name

Beachten Sie, dass es etwas sinnlos erscheint, ein Archiv mit nur einem Modul zu erstellen. Sie hätten genauso gut schreiben können:

g++ test.cpp header.cpp -o executable_name

Trotzdem gebe ich Ihnen den Vorteil des Zweifels, dass Ihr tatsächlicher Anwendungsfall mit mehr Modulen etwas komplexer ist.

Hoffe das hilft!


1
Wie schließen wir mehrere Module ein?
Sidhin S Thomas

2
Gut! Manchmal sehen wir, ranlibwas in GNU einfach bedeutet ar s.
Viet
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.