# 动态链接库的制作、加载和系统调用 + 软连接
0.什么是动态链接库
目标文件的集合
1.制作
gcc -fpic -shared fun.c -o libfun.so
# -fpic 编译生成地址无关的代码
# -shared 生成动态链接库
2.加载
gcc -o main main.c ./libfun.so
gcc -o main main.c -L./ -lfun
# -L 指定动态链接库的路径
# -lfun 链接库函数fun,但是运行会出现问题
# 将动态链接库路径加入环境变量LD_LIBRARY_PATH中
3.系统调用
void * dlopen(const char *filename, int flag)
dlerror()
void * dlsym(void *handle, char *symbol)
dlclose()
# 例子:
int main()
{
void *handle;
char *error;
double (*cosine)(double);
handle = dlopen("/lib/libm.so.6", RTLD_LAZY);
if(!handle)
{
fputs(dlerror(), stderr);
exit(1);
}
cosine = dlsym(handle, "cos");
if((error = dlerror()) != NULL)
{
fputs(error, stderr);
exit(1);
}
printf("%f", (*cosine)(2, 0));
dlclose(handle);
return 0;
}
# 关于ar命令的引入
ar rcs libxxx.a xx1.o xx2.o
替换/创建静态库,s是创建目标文件的索引
ar t libxxx.a
# 查看库文件中有哪些目标文件
ar tv libxxx
# 同上,显示详细信息
nm -s libxxx.a
# 显示库文件中的索引表
ranlib libxxx.a
# 为库文件创建索引表
# 创建并使用静态链接库
touch test.h test.c main.c
gcc -c test.c
ar rcs libtest.a test.o
gcc -o main main.c -L./ -ltest
./main
# 软连接的制作
ln -s <srcname> <linkname>
# 删除除了某一文件的其他文件
rm -f !(test.c|main.c)
# 上述命令不成功,执行这一命令
shopt -s extglob
信号处理和网络方面的内容还在学习,
信号处理的内容要先学习一下进程的知识,后面一起总结吧