记住步骤,先用别的文件生成库文件,而后生成源码的.o 文件,而后进行链接 链接主要是第二种方法,第一种是直接链接比较简单,第三种是第二种的改编, gcc/cc main.o -l add -L .最后的是文件的路径,我的虚拟机出了问题我不能自己直接链接了
共享库的动态加载
1 dlopen 函数
动态加载共享库功能函数的接口函数,
#include
void *dlopen (const char * filename,int flag);
dlopen 第一个参数是共享库文件的函数名,第二个是int型标志位,返回值是void * 是viod 类型的函数指针。就是句柄,暂时理解为首地址。
函数功能是打开和加载库文件。
如果调用失败,返回一个空地址NULL;成功就返回句柄。
传递第二个实参,必须包括两个参数 RTLD_LAZY和 RTLD_NOW。第一个表示延迟加载,第二个表示立即加载。
2 dlerror char *dlerror (void);
返回的就是dlopen dlclose dlsym 三个函数的最近发生的一个错误信息。返回NULL则表示没有错误发生。
3 dlsym 函数
void *dlsym(void * handle,const char *symbol);
第一个参数要的是一个句柄信息,也就是dlopen 这个函数的返回值
第二个参数 字符串形式的符号,表示函数名
返回值:成功返回的是函数在内存中的地址,失败返回NULL,
函数功能:主要用于根据句柄和函数名获取在内存中的地址。
4 dlclose 函数,int dlclose (void *handle );
参数是dlopen 的返回值,用来关闭dlopen 的返回值所指定的共享库,就是回收动态库在加载中所占有的空间。
5
返回0 表示成功,返回非零表示失败。当共享库不在被函数使用的时候,不在被任何程序使用时候,则收回共享库所占有的空间。
注意:编译链接时候需要增加选项:-ldl
共享库的动态加载。dynamic
编程实现打印空心的菱形和实心的菱形。对打印函数所在的文件分别打包成静态库文件和共享库文件进行调用。