2016-04-23 7 views
0

Ich habe eine main.exe und zwei Bibliotheken (lib1 und lib2):Gibt es eine Möglichkeit, ungenutzte Bibliotheken beim Linken zu überspringen?

In main.exe:

extern void f3(); 

int main() { 
    f3(); 
} 

In lib1.cpp:

extern void f4(); 
void f2() { 
    f4(); 
} 

void f3() { 
} 

In lib2.cpp:

void f4() { 
} 

So theoretisch, ich brauche nur lib1 main.exe erfolgreich zu bauen, weil nur f3() wird von main() aufgerufen.

Allerdings habe ich sowohl unter gcc und MSVC gefunden, ich muss auch lib2 haben, sonst Linker meldet es kann f4() nicht finden.

Ich habe Linker Flag --as-needed versucht, aber es hilft nicht. Meine Frage ist also: Gibt es eine Möglichkeit (z. B. Linker-Flags), die ich verwenden kann, um main.exe erfolgreich ohne lib2 zu erstellen? Angenommen, ich kann keinen C++ - Quellcode ändern.

+0

Die kurze Antwort ist: Nein, gibt es nicht. –

+0

Angenommen, Sie verknüpfen statische Bibliotheken, wenn der Linker mit lib1 verbindet und sieht, dass er f4 aufruft, wird er versuchen, lib2 zu verknüpfen. Ich denke du brauchst beides. – Dan

+0

Ich denke, das Objekt Dateiformat zeigt nicht alle Abhängigkeiten an, so dass es zur Verbindungszeit nicht sagen kann, dass 'f4' nicht reacable ist. – Barmar

Antwort

0

Die Flagge --as-needed funktioniert nicht, da der Linker keine undefinierten Identifikatoren zu lösen versucht, die Dateien in Ihrem Objekt vorhanden.

Grundsätzlich müssen Sie eine Implementierung von f4() enthalten. Aber aus irgendeinem Grund, den Sie lib2 Ihrem Linker nicht bereitstellen möchten, können Sie einen Dummy lib2 erstellen, der Ihre Dummy-Implementierung f4 enthält (eine cpp-Datei mit einer leeren f4-Funktion wird den Trick tun).

Zum Beispiel:

gcc main.cpp lib1.o lib2_dummy.cpp -o main.exe 
+0

Danke. Genau so habe ich das Problem gelöst. – stanleyli

0

Sie können lib1.cpp in zwei Quellmodule, lib1a.cpp und lib1b.cpp, aufteilen und beide in die Bibliothek lib1 einfügen. Dann wird der Linker f3 importieren können, ohne f2 zu importieren, und so wird lib2 nicht benötigt.

lib1a.cpp

extern void f4(); 
void f2() { 
    f4(); 
} 

lib1b.cpp

void f3() { 
} 
+0

Die Frage mensioned dass "Angenommen, ich kann keinen C++ Quellcode ändern" – gdlmx

Verwandte Themen