Linux编程环境(Linux网络编程笔记)02
GCC(续)
生成动态链接库
- 动态链接库时程序运行时加载的库,所有的程序都可以使用动态库来运行程序。动态链接库是目标文件的集合,库中函数和变量的地址是相对的,不是绝对地址,其真实地址在调用库的程序加载时形成的。
- 动态链接库有别名,真名和连接名。
别名 | 前缀lib+库名+.so |
---|---|
真名 | 动态链接库真实名称 |
连接名 | 动态库安装时,复制文件到某目录下并用软链接生成别名 |
- 生成动态链接库
使用-fpic选项或者-fPIC选项。例如
$gcc -shared -WL,-soname,libstr.so -o libstr.so.l string.c
上面的命令可以将string.c编译生成动态链接库。
项目 | 作用 |
---|---|
-shared | 告诉编译器生成一个动态链接库 |
-soname,libstr.so | 表示生成的别名为libstr.so |
-o libstr.so.l | 表示生成名为libstr.so.l的动态库链接文件 |
2.动态链接库的配置
动态库不能随意使用,要在运行的程序中使用动态链接库,需要指定系统的动态链接库搜索的路径,让系统找到所需的动态链接库才可以。查看系统中的动态链接库配置文件的内容:
$cat /ect/ld.so.conf
include /ect/ld.so.conf.d/*.conf
3.动态链接库管理命令
为了让新增的动态链接库可以被系统共享,需要运行动态链接库的管理命令ldconfig。ldconfig命令的作用是在系统默认路径搜索和动态链接库配置的文件中所列出的目录里搜索动态链接库,创建动态链接装入程序需要的链接和缓存文件。其用法如下:
选项 | 含义 |
---|---|
-v | 此选项打印ldconfig的当前版本号,显示所扫描的每一个动态链接库和目录 |
-n | 此选项处理命令行指定的目录,不对系统默认目录和配置文件中指定的目录进行扫描 |
-N | 此选项ldconfig不会重建缓存文件 |
-X | 此选项ldconfig不会更新链接 |
-f CONF | 此选项使用用户指定的文件代替默认文件 |
-C CACHE | 此选项使用用户指定的文件代替系统的默认缓存文件 |
-r ROOT | 此选项改变当前应用程序的根目录 |
-p或–print-cache | 此选项用于打印出缓存文件中的共享库的名字 |
使用ldconfig命令,默认情况下不会将扫描结果输出。
4.使用动态链接库
在编译程序时,使用动态链接库和静态链接库是一致的,使用“-l库名”的方式。在生成可执行文件时会链接库文件。例如下面的命令可以将源文件main.c编译成可执行文件test并连接库文件libstr.a或者libstr.so:
$gcc -o test main.c -L./ -lstr
动态库加载
1.打开动态库的dlopen()函数
使用方式:
void *phandle = dlopen("./libstr.so",RTLD_LAZY);
2.获得函数指针dlsym()函数
该函数可获得动态链接库中指定函数的指针,然后可以使用这个函数指针进行操作。函数原型如下:
void *dlsym(void *handle,char *symbol);
3.使用动态加载库的一个例子:
/*动态加载库实例*/
#include<dlfcn.h>//动态加载库库头
int main (void)
{
char src[]="hello tom"; //要计算的字符串
int (*pStrLenFun)(char *str); //函数指针
void *pStrLenFun = NULL; //库具柄
char *perr = NULL; //错误星系==信息指针
phandle = dlopn("./libstr.so",RTLD_LAZY); //打开libstr.so动态链接库
if (!phandle) //判断是否正确打开
{
printf("Failed") //打开错误
}
perr = dlerror(); //读取错误值
if (perr != null) //存在错误
{
printf("%s\n",perr);
return 0; //正常返回
}
pStrLenFun = dlsym(phandle,"StrLen"); //获得函数地址
perr = dlerror(); //读取错误信息
if (perr != NULL) //存在错误
{
printf("%s\n",perr); //打印错误星系
return 0; //返回
}
printf("the string's length is : %d",pStrLenFun(src)); //调用函数计算字符串长度
dlclose(phandle); //关闭动态库
return 0;
}
使用如下代码编译为可执行文件
$gcc -o testdl main.c libstr.so -ldl
执行结果为:
$./testdl
the string's length is : 13
使用动态加载库和动态链接库的结果是一致的。