Ich spalte einen Teil des Codes in meinem Projekt in eine separate Bibliothek, um in einer anderen Anwendung wiederverwendet zu werden. Diese neue Bibliothek hat verschiedene Funktionen definiert , aber nicht implementiert , und sowohl mein aktuelles Projekt als auch die andere Anwendung implementieren ihre eigenen Versionen dieser Funktionen.
Ich habe diese Funktionen in meinem ursprünglichen Projekt implementiert, aber sie werden nirgendwo anders aufgerufen. Sie werden nur von dieser neuen Bibliothek aufgerufen. Als Ergebnis optimiert der Compiler sie, und ich bekomme Verbindungsfehler. Wenn ich diesen Funktionen einen Dummy-Aufruf hinzufüge, verschwinden die Verknüpfungsfehler.
Gibt es eine Möglichkeit, GCC zu sagen, diese Funktionen zu kompilieren, selbst wenn sie nicht aufgerufen werden?
Ich kompiliere mit gcc 4.2.2 mit -O2
auf SuSE linux (x86-64_linux_2.6.5_ImageSLES9SP3-3).
Sie könnten __attribute__ ((used))
ausprobieren - siehe Funktionen von Funktionen deklarieren in das GCC-Handbuch.
Als Pragmatiker würde ich einfach sagen:
%Vor% auf der Dateiebene einer Ihrer Quelldateien (oder sogar eine brandneue Quelldatei, etwas in der Art von forcedCompiledFunctions.c
, so dass es offensichtlich ist, wofür es ist).
Da dies nicht statisch ist, kann der Compiler kein Risiko eingehen, dass Sie ihn nicht anderweitig benötigen, also sollten Sie ihn kompilieren.
Ihre Frage fehlt ein paar Details, aber ich werde es versuchen ...
GCC entfernt in der Regel Funktionen in sehr wenigen Fällen:
Ich empfehle die Verwendung von 'nm', um zu sehen, welche Symbole tatsächlich in den resultierenden .o-Dateien exportiert werden, um zu überprüfen, ob dies tatsächlich der Fall ist, und dann über irgendwelche 'statischen' Stichwörter zu sehen. Nicht unbedingt in dieser Reihenfolge ...
BEARBEITEN:
Übrigens, mit den Optionen -Wall oder -Wunused GCC wird vor unbenutzten Funktionen gewarnt, die dann die wichtigsten Ziele für das Entfernen bei der Optimierung sein werden. Achte auf
Warnung: 'xxx' definiert, aber nicht verwendet
in Ihren Kompilierprotokollen.
Einige möglicherweise nützliche Vorschläge hier: Ausschalten der Optimierung für eine bestimmte Funktion in gcc 4.2.2
Tags und Links optimization gcc