首先,创建目标文件

在把hfcal.c代码转换为动态库之前需要把它先编译为.o目标文件,像这样:

首先,创建目标文件 - 图1

发现区别了吗?这次在创建hfcal.o时多加了一个标志:-fPIC。它告诉gcc你想创建位置无关代码。有的操作系统和处理器要用位置无关代码创建库,这样它们才能在运行时决定把代码加载到存储器的哪个位置。

首先,创建目标文件 - 图2

事实上在大多数操作系统中都不需要加这个选择。试试吧,不加也没有关系。首先,创建目标文件 - 图3

首先,创建目标文件 - 图4百宝箱

什么是位置无关代码?

位置无关代码就是无论计算机把它加载到存储器的哪个位置都可以运行的代码。想象你有一个动态库,它要使用加载点500个字节以外的某个全局变量的值,那么如果操作系统把库加载到其他地方就会出错。只要让编译器创建位置无关的代码,就可以避免这种问题。

包括Windows在内的一些操作系统在加载动态库时会使用一种叫存储器映射的技术,也就是说所有代码其实都是位置无关的。若你在Windows上用刚刚那条命令编译代码,gcc可能会给出一条警告,告诉你不需要-fPIC选项。你既可以奉命删除它,也可以当作没看见。