GCC中的-fPIC标志是什么,为什么在构建库时需要它?
大家好!我开始学习C++,并尝试在Linux上使用GCC构建一个动态库(.so)。我到处看到在编译库的目标文件时会添加-fPIC标志,但我不明白为什么需要它。
这是我的简单示例。有一个文件 `math_utils.cpp`:
```cpp
int add(int a, int b) {
return a + b;
}
int multiply(int a, int b) {
return a * b;
}
```
我这样编译:
```bash
g++ -c math_utils.cpp -o math_utils.o
g++ -shared math_utils.o -o libmath.so
```
而且一切正常!库被创建,程序可以链接并使用这些函数。但如果我添加-fPIC:
```bash
g++ -c -fPIC math_utils.cpp -o math_utils.o
```
结果是一样的。有什么区别?我在网上搜索时,看到有人说在x86_64上不加-fPIC可能会出错,但我的编译没问题。请解释一下什么是Position Independent Code,以及是否必须为shared libraries使用-fPIC?有没有非用不可的情况?提前谢谢!
<<>>