今天写代码的时候,发现需要之前的一些实现,有不想直接将代码复制过来,于是就想把之前实现的代码编译成一个动态链接库,这样显得更加的优雅。几番摸索之后,终有所获,遂记之~
首先,我们约定要编译的文件名是 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
说明系统还是找不到我们的动态库路径,那么有两种解决方法:
将我们编译的 .so 文件复制到 /usr/lib 或者是 /usr/local/lib
将当前路径加入到
LD_LIBRARY_PATH
变量,使用如下命令:
export LD_LIBRARY_PATH=./
至此,所有工作完成,编译成功~
Author: simowce
Permalink: https://blog.simowce.com/compile-code-to-so-library/
本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。