Ich habe einen kleinen Code, der von vielen statischen Bibliotheken abhängt (a_1-a_n). Ich möchte diesen Code in eine statische Bibliothek packen und anderen Personen zur Verfügung stellen.
Meine statische Bibliothek, nennen wir sie X, lässt sich gut kompilieren.
Ich habe ein einfaches Beispielprogramm erstellt, das eine Funktion von X verwendet, aber wenn ich versuche, sie mit X zu verknüpfen, erhalte ich viele Fehler bezüglich fehlender Symbole aus den Bibliotheken a_1 - a_n.
Gibt es eine Möglichkeit, eine neue statische Bibliothek Y zu erstellen, die X und alle von X benötigten Funktionen enthält (ausgewählte Bits von a_1 - a_n), sodass ich nur Y verteilen kann, mit dem Benutzer ihre Programme verknüpfen können?
AKTUALISIEREN:
Ich habe mir angesehen, einfach alles mit ar zu sichern und eine Mega-Lib zu erstellen, die jedoch viele Symbole enthält, die nicht benötigt werden (alle .o-Dateien sind ungefähr 700 MB groß, eine statisch verknüpfte ausführbare Datei ist jedoch 7 MB). Gibt es eine gute Möglichkeit, nur das einzubeziehen, was tatsächlich benötigt wird?
Dies hängt eng mit dem Kombinieren mehrerer C / C ++ - Bibliotheken zu einer zusammen. .
-r
dass die Ausgabe als Eingabe für ld verwendet werden kann. Wenn Sie einmal verlinken, sollten Sie einen Umzug erhalten, der Ihre Bibliotheken ersetzen kann. (habe es thogh versucht).Wenn Sie Visual Studio verwenden, können Sie dies tun.
Mit dem mit Visual Studio gelieferten Tool zum Erstellen von Bibliotheken können Sie Bibliotheken über die Befehlszeile zusammenfügen. Ich kenne jedoch keine Möglichkeit, dies im visuellen Editor zu tun.
quelle
Unter Linux oder MingW mit GNU-Toolchain:
Von wenn Sie nicht löschen
liba.a
undlibb.a
Sie können „thin - Archiv“ machen:Unter Windows mit der MSVC-Toolchain:
quelle
ar crsT
, was so etwas wie "Symlinking" macht, anstatt zu kopieren, dann müssen Sie nur eine Kopie der Daten versenden.Eine statische Bibliothek ist nur ein Archiv von
.o
Objektdateien. Extrahieren Sie sie mitar
(unter der Annahme von Unix) und packen Sie sie wieder in eine große Bibliothek.quelle
Alternativ zu den
Link Library Dependencies
Projekteigenschaften gibt es eine andere Möglichkeit, Bibliotheken in Visual Studio zu verknüpfen.Add Existing Item...
).Item Type
istLibrary
Dies schließt die anderen Bibliotheken in X ein, als ob Sie ausgeführt hätten
quelle
Beachten Sie, bevor Sie den Rest lesen: Das hier gezeigte Shell-Skript ist sicherlich nicht sicher zu verwenden und gut getestet. Benutzung auf eigene Gefahr!
Ich habe ein Bash-Skript geschrieben, um diese Aufgabe zu erfüllen. Angenommen, Ihre Bibliothek ist lib1 und diejenige, aus der Sie einige Symbole einfügen müssen, ist lib2. Das Skript wird jetzt in einer Schleife ausgeführt, in der zunächst überprüft wird, welche undefinierten Symbole aus lib1 in lib2 gefunden werden können. Anschließend extrahiert es die entsprechenden Objektdateien aus lib2 mit
ar
, benennt sie ein wenig um und fügt sie in lib1 ein. Jetzt fehlen möglicherweise mehr Symbole, da die Inhalte, die Sie aus lib2 hinzugefügt haben, andere Inhalte aus lib2 benötigen, die wir noch nicht aufgenommen haben. Daher muss die Schleife erneut ausgeführt werden. Wenn nach einigen Durchläufen der Schleife keine Änderungen mehr vorgenommen werden, dh keine Objektdateien von lib2 zu lib1 hinzugefügt wurden, kann die Schleife gestoppt werden.Beachten Sie, dass die enthaltenen Symbole immer noch als undefiniert von gemeldet werden.
nm
Daher verfolge ich die Objektdateien, die lib1 selbst hinzugefügt wurden, um festzustellen, ob die Schleife gestoppt werden kann.Ich habe dieses Skript benannt
libcomp
, damit Sie es dann zB mit aufrufen könnenwo libwhatever ist, wo Sie Symbole einfügen möchten. Ich denke jedoch, dass es am sichersten ist, alles zuerst in ein separates Verzeichnis zu kopieren. Ich würde meinem Skript nicht so sehr vertrauen (es hat jedoch bei mir funktioniert; ich könnte libgsl.a damit in meine numerische Bibliothek aufnehmen und diesen -lgsl-Compiler-Schalter weglassen).
quelle