动态链接库 .so 的编译和使用

代码之外
Article Directory

今天写代码的时候,发现需要之前的一些实现,有不想直接将代码复制过来,于是就想把之前实现的代码编译成一个动态链接库,这样显得更加的优雅。几番摸索之后,终有所获,遂记之~


首先,我们约定要编译的文件名是 code.c ,编译后的动态库名是 libcode.so (注意,共享库的命名一般都是 libxxx 的),目标文件是 target.c 。于是,编译命令如下:

gcc -fPIC -shared libcode.so code.c

这里解释一下:

-fPIC: 这个选项告诉编译器,产生与位置无关的代码(Position-Independent-Code)。也就是说,产生的代码中,没有绝对地址,之后相对地址,因此代码可以被加载器加载到内存的任意位置,都可以正确运行。而这正是共享库所需要的,因为共享库在被加载的时候,在内存的位置是不固定。

-shared: 这个选项指定生成动态链接库

然后我们需要将生成的动态库链接到我们的目标文件上,编译命令如下:

gcc target.c -o target -L ./ -lcode

解释一下:

-L: 这一个跟 -I 很像,就是表示要链接的库在参数指定的位置中

-lcode: 用来指定库名,而库名的命名规则是 libxxx 的,所以这个选项只需要后面的部分,即 -lxxx

注意,在编译目标文件的时候可能会出现下面的错误:

error while loading shared libraries

说明系统还是找不到我们的动态库路径,那么有两种解决方法:

  1. 将我们编译的 .so 文件复制到 /usr/lib 或者是 /usr/local/lib

  2. 将当前路径加入到 LD_LIBRARY_PATH 变量,使用如下命令:

export LD_LIBRARY_PATH=./

至此,所有工作完成,编译成功~

Author: simowce

Permalink: https://blog.simowce.com/compile-code-to-so-library/

知识共享许可协议
本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。