共享库代码
libfoo.c文件实现一个打印函数接口,包含头文件stdio.h,依赖libc库的printf函数。
#include <stdio.h>
int foo_pri(int n)
{
printf("n=%d\n",n);
return n;
}
编译共享库
gcc -shared -fPIC -g -Wall -o libfoo.so.1.0.0 libfoo.c
-shared Create a shared library
-fPIC 使用地址无关代码技术
查看库依赖
[yubo.wang@localhost lib-study]$ readelf -d libfoo.so.1.0.0
Dynamic section at offset 0xe18 contains 24 entries:
标记 类型 名称/值
0x0000000000000001 (NEEDED) 共享库:[libc.so.6]
0x000000000000000c (INIT) 0x530
0x000000000000000d (FINI) 0x68c
测试文件
int main()
{
foo_pri(100);
return 0;
}
编译文件
[yubo.wang@localhost lib-study]$ gcc -L./ -lfoo main.c
/usr/bin/ld: 找不到 -lfoo
collect2: 错误:ld 返回 1
链接库文件
符合共享库文件命名方式
ln -s libfoo.so.1.0.0 libfoo.so
lrwxrwxrwx. 1 yubo.wang yubo.wang 15 8月 3 16:14 libfoo.so -> libfoo.so.1.0.0
-rwxrwxr-x. 1 yubo.wang yubo.wang 9168 8月 3 15:54 libfoo.so.1.0.0
再次编译成功,生成a.out文件。
[yubo.wang@localhost lib-study]$ readelf -d a.out
Dynamic section at offset 0xe18 contains 25 entries:
标记 类型 名称/值
0x0000000000000001 (NEEDED) 共享库:[libfoo.so]
0x0000000000000001 (NEEDED) 共享库:[libc.so.6]
运行文件
[yubo.wang@localhost lib-study]$ LD_LIBRARY_PATH=./ ./a.out
n=100
LD_LIBRARY_PATH=./指定连接器共享库的查找优先路径。不加这个选项会提示如下:
./a.out: error while loading shared libraries: libfoo.so: cannot open shared object file: No such file or directory
本文介绍了一个名为libfoo.so的共享库的创建过程,包括libfoo.c源文件中实现的打印函数接口,使用gcc编译器的-shared和-fPIC选项进行编译,以及如何解决链接库文件时出现的错误。文章还详细描述了如何通过符号链接来符合共享库文件命名方式,并在编译测试文件时指定正确的库路径。
756

被折叠的 条评论
为什么被折叠?



