1. 编写代码
int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } # base.h的内容 int add(int, int); int sub(int, int); #include<stdio.h> #include "base.h" int main() { printf("10 + 20 = %d\n", add(10, 20)); printf("20 - 10 = %d\n", sub(20, 10)); return 0; }
2. 生成动态库
gcc -c -fpic add.c sub.c gcc -shared add.o sub.o -o libbase.so 或 gcc -fpic -shared add.c sub.c -o libbase.so
3. 使用动态库
方式1:执行如下两条命令会再当前目录下生成main程序
执行ldd main命令可以看到main链接库的信息gcc -c main.c gcc main.o ./libbase.so -o main
ldd main linux-vdso.so.1 => (0x00007ffec5bb7000) libbase.so (0x00007fddb700e000) libc.so.6 => /usr/lib64/libc.so.6 (0x00007fddb6c31000) /lib64/ld-linux-x86-64.so.2 (0x00007fddb7211000)
方式2:执行如下命令生成main程序
注意:此处与上面的方式不同之处在于指定链接库路径及链接库名称
gcc -c main.c gcc main.o -L. -lbase -o main
生成main之后, 执行ldd main查看链接库信息ldd main linux-vdso.so.1 => (0x00007fff78bb1000) libbase.so => not found libc.so.6 => /usr/lib64/libc.so.6 (0x00007fefcd5ea000) /lib64/ld-linux-x86-64.so.2 (0x00007fefcd9c8000)
不难看出, 如上的方式生成的可执行文件main, 在使用ldd查看时, 提示libbase.so未找到
这是因为-L及-l选项只是告诉编译器库的名字, 而在目标系统支持的情况下, fpic会生成与位置无关的代码
因此实际上编译之后的main中并未记录libbase.so的位置, 仍在系统默认的路径查找
可以使用如下方式进行解决
再次使用ldd main查看时, 就不会报错not foundexport LD_LIBRARY_PATH = /home/developer/c/ 或 export LD_LIBRARY_PATH = /home/developer/c/libbase.so
ldd main linux-vdso.so.1 => (0x00007ffd767ad000) libbase.so => /home/developer/c/libbase.so (0x00007f50e3154000) libc.so.6 => /usr/lib64/libc.so.6 (0x00007f50e2d77000) /lib64/ld-linux-x86-64.so.2 (0x00007f50e3357000)
当然也可以配置系统的ld.so.conf文件进行配置, 配置之后执行ldconfig命令即可
以上内容, 如有错误, 欢迎批评指正。