编译过程:
预处理:处理注释,宏以及以#开头的符号 gcc -E filew.c -o file.i
编译: 进行词法分析,语法分析和语义分析 gcc -S file.i -o file.s
汇编: 将汇编代码翻译为机器指令的目标文件 gcc -c file.s -o file.o
链接:
静态链接: 编译静态库源码 gcc -c lib.c -o lib.o 生成静态库文件ar -q lib.a lib.o 使用静态库编译 gcc main.c lib.a -o main.out
动态链接:编译动态库源码gcc -shared dlib.c -o dlib.so 使用动态库编译gcc main.c -ldl -o main.out
关键系统调用 : dlopen:打开动态库文件
dlsym: 查找动态库中的函数并返回调用地址
dlclose:关闭动态库文件
#include <stdio.h>
#include <dlfcn.h>
int main()
{
void* pdlib = dlopen("./dlib.so", RTLD_LAZY);
char* (*pname)();
int (*padd)(int, int);
if( pdlib != NULL )
{
pname = dlsym(pdlib, "name");
padd = dlsym(pdlib, "add");
if( (pname != NULL) && (padd != NULL) )
{
printf("Name: %s\n", pname());
printf("Result: %d\n", padd(2, 3));
}
dlclose(pdlib);
}
else
{
printf("Cannot open lib ...\n");
}
return 0;
}