2017-03-24 1 views
1

Ich verstehe g ++ -fPIC-Option als schön explainjed in: GCC -fPIC option Ich habe viele Quelldateien, die durch makefile für Build verwaltet werden. Es ist schwierig, Quelldateien zu trennen, die Teil einer ausführbaren oder gemeinsam genutzten Bibliothek sein sollen. Kann ich -fPIC Möglichkeit, g ++ für jede Datei verwendet, die wie unter Kompilierung geht:ist g ++ -fPIC auch für ausführbare Dateien neben Shared Libraries anwendbar?

g++ -c -fPIC .... 

und es später, wenn eine gemeinsam genutzte Bibliothek, Verbindung mit -shared ist, sonst ohne -shared für ausführbare Datei.

Antwort

1

Es ist möglich, ausführbare Dateien mit -fPIC zu erstellen, dies kann jedoch zu Leistungseinbußen führen, da der Compiler konservativere Annahmen anstellt, z. über Inlining (um runtime symbol interposition zu erlauben). Um eine positionsunabhängige ausführbare Datei zu erstellen, verwenden Sie am besten -fPIE Flag (die meisten modernen Distributionen, z. B. Ubuntu, bauen sie jetzt standardmäßig auf).

In jedem Fall, es sei denn, Sie kümmern sich nicht um die Leistung, müssen Sie Ihre Dateien zweimal mit unterschiedlichen Flags kompilieren.

+0

-fPIC ist auf vielen Systemen erforderlich AFAIK – OMGtechy

+0

@OMGtechy Ich wäre neugierig auf bestimmte Beispiele zu wissen. – yugr

0

Kann ich die Option -fPIC von g ++ für jede Datei verwenden, die kompiliert wird?

Ja. Wenn etwas wie eine Assembly-Datei angegeben wird, hat es nur keinen Effekt.

[...] und später, wenn es eine gemeinsam genutzte Bibliothek ist, Verbindung mit -shared?

Ja.

+0

In dieser Antwort werden mögliche Konsequenzen der Verwendung von "-fPIC" (z. B. Leistungsprobleme) nicht erwähnt. – yugr

Verwandte Themen