我们都知道在windows环境中写链接程序,动态链接库是.lib文件,而在Linux是.so文件。那么如何编写.so文件及使用呢?下面写举一个小例子帮助初学者入门。Ps:其实网上已经有很多关于这样的文章了,在这呢,就是想帮助初学者入门及自己做个笔记。Here we go。
1.先编写一个头文件,包含要封装的函数。名字为test_so.h
#incude<stdio.h>
void test_01();
void test_02();
2.编写头文件中函数的实现 test_01.c
#include “test_so.h”
void test_01()
{
printf(“test_01\n”);
}
同理test_02.c
#include “test_so.h”
void test_02()
{
printf(“test_02\n”);
}
3.将上述文件编译生成.so文件
gcc test_01.c test_02.c –fPIC –shared –o libtest.so
4.接下来编写测试程序。test.c
#include “test_so.h”
#include <stdio.h>
int main()
{
test_01();
test_02();
return0;
}
5.编译生成可执行文件,测试动态库是否成功。
gcc test.c –L. –ltest –o test
最后,执行./test。
关于上面的gcc编译的参数说明一下:(具体可以man gcc)
-fPIC: 表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
-L:库文件(.so)所在的目录
-l:指定程序要链接的库名,如libtest.so,则写为-ltest,匹配时会自动寻找libtest.so。
ps:刚开始运行时会出现错误。解决方法
ldd test显示 libtest.so not found
原因是因为没有设置LD_LIBRARY_PATH变量,通常有三种方式
1、临时修改,当退出后下次登录就失效了。
在terminal中执行:exportLD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
(:后加要增加的路径,此处写为.即为当前目录)
2、让当前帐号以后都优先加载当前目录的动态库
修改用户的配置文件~/.bash_profile在文件末尾加上如下两行
LD_LIBRARY_PATH=./ 和 exportLD_LIBRARY_PATH
3、让所有帐号从此都优先加载当前目录的动态库
修改系统配置文件/etc/profile在文件末尾加上如下两行:
LD_LIBRARY_PATH=./ 和 exportLD_LIBRARY_PATH