Was ist das Flag -fPIC in GCC und warum wird es beim Bau von Bibliotheken benötigt?
Hallo zusammen! Ich habe angefangen, C++ zu lernen und versuche, eine dynamische Bibliothek (.so) unter Linux mit GCC zu bauen. Ich sehe überall, dass beim Kompilieren von Objekten für die Bibliothek das Flag -fPIC hinzugefügt wird, aber ich verstehe nicht, warum es nötig ist.
Hier ist mein einfaches Beispiel. Es gibt eine Datei `math_utils.cpp`:
```cpp
int add(int a, int b) {
return a + b;
}
int multiply(int a, int b) {
return a * b;
}
```
Ich kompiliere so:
```bash
g++ -c math_utils.cpp -o math_utils.o
g++ -shared math_utils.o -o libmath.so
```
Und alles funktioniert! Die Bibliothek wird erstellt, das Programm bindet sie ein und verwendet die Funktionen. Aber wenn ich -fPIC hinzufüge:
```bash
g++ -c -fPIC math_utils.cpp -o math_utils.o
```
Das Ergebnis ist dasselbe. Was ist der Unterschied? Wenn ich gegoogelt habe, schreiben sie, dass ohne -fPIC auf x86_64 ein Fehler auftreten kann, aber bei mir kompiliert alles. Erklärt mir bitte, was Position Independent Code ist, und ist es zwingend erforderlich, -fPIC für shared libraries zu verwenden? Gibt es Fälle, in denen man ohne es nicht auskommt? Vielen Dank im Voraus!
<<>>