2016-05-18 13 views
1

Betrachten Sie dieses Szenario (alles im Release-Modus) zu entfernen:VC++ Linker indirekte Abhängigkeiten für statische Bibliotheken

a.lib includes f1() and f2(). 
a.lib is built using /LTCG on VS2015. 
f1() is local without any external function calls. 
f2() calls fc() from b.lib 

b.lib includes fc() and 100s of other functions. 
b.lib is built by a 3rd party, probably not VS. 

main.exe is built only with main.cpp, using /LTCG on VS2015. 
main.exe links to a.lib and b.lib 
main.cpp only calls f1() 

Nun, wenn ich main.exe bauen, ich erwarte, dass es nur f1() 's Umsetzung einzubeziehen . Die Größe der ausführbaren Datei beträgt ~ 10 MB.

Wenn ich jedoch f2() die Implementierung in a.lib auskommentieren und a.lib neu aufbauen, dann wird main.exe 200KB. Es funktioniert in beiden Fällen genau gleich.

Meine Sorge ist sowohl die Größe der ausführbaren Datei und entlarvt alles über b.lib (die nicht meine eigene Bibliothek ist) unnötig.

Frage: Warum ist der Linker nicht schlau genug, um f2() -> fc() Definitionen nicht zu enthalten? während es schlau genug ist, den Rest von b.lib nicht einzuschließen (was mehr als 100 MB ist)?

+1

Können Sie mit dem Erstellen von a.lib mit der C/C++/Gy-Option experimentieren und Ihre ausführbare Datei mithilfe der Linker/OPT-Option verknüpfen? –

+0

/Gy ist bereits für a.lib definiert, für ausführbare Datei/OPT: ICF und/OPT: REF sind bereits aktiviert. Hast du ein anderes/OPT im Kopf? – Alparslan

Antwort

1

Der Linker zieht alle Statiken, die fc verwenden kann (wie eine Zuordnung von Fehlernummern zu Strings) und alle (potenziell) von fc aufgerufenen Funktionen und alle Funktionen, die die Statik zur Initialisierung verwendet .

Ich würde mir keine Sorgen machen über Ihre Nutzung von b.lib (vorausgesetzt, Sie haben es ordnungsgemäß lizenziert), Schutz der IPR in das ist das Problem des Anbieters.

Ausführbare Größe ist ein echtes Problem, aber ich glaube nicht, dass Sie viel dagegen tun können.

+0

Ich weiß, dass alles, was mit fc zu tun hat, hineingezogen wird, aber ich weiß nicht, warum es notwendig ist, das ist meine Frage. BTW, b.lib ist ordnungsgemäß lizenziert. Aber ich möchte nicht einmal seinen Maschinencode liefern, wenn ich es nicht brauche, weil wir b.lib für sehr spezielle Produkte verwenden, während a.lib unter all unseren Produkten geteilt wird. – Alparslan

+0

Ohne die Interna von b.lib zu kennen, können wir nicht sagen, warum alles benötigt wird. –

+0

Sie sagen "Ich möchte nicht einmal seinen Maschinencode versenden, wenn ich das nicht brauche, weil wir b.lib für ganz spezielle Produkte verwenden", aber das ergibt für mich keinen Sinn. Du hast eine Lizenz, um b.lib zu benutzen, benutze es wenn es nötig ist - warum ist es dir wichtig, wenn ein Teil des Maschinencodes hineingezogen wird? –

Verwandte Themen