1、编译动态库
编写mylib.h
#ifndef __MYLIB_H__
#define __MYLIB_H__
int test();
#endif片
编写mylib.c
#include <stdio.h>
#include "mylib.h"
int test()
{
printf("mytest\n");
}
编译成mylib.o文件
gcc -fPIC -c mylib.c
fPIC 作用于编译阶段,告诉编译器产生与位置无关代码(Position-Independent Code), 则产生的代码中,没有绝对地址,全部使用相对地址,故而代码可以被加载器加载到内存的任意 位置,都可以正确的执行。这正是共享库所要求的,共享库被加载时,在内存的位置不是固定的。
链接成动态库libmy.so
gcc -shared mylib.o -o libmy.so
编译跟链接一起执行
gcc -shared -fPIC mylib.c -o libmy.so
调用动态库
调用动态库,编写调用代码test.c
#include "mylib.h"
int main()
{
test();
return 0;
}
编译时带上库路径
gcc -o test test.c libmy.so
编译静态库
编写mylib.h
#ifndef __MYLIB_H__
#define __MYLIB_H__
int test();
#endif
编写mylib.c
#include <stdio.h>
#include "test.h"
int test()
{
printf("mytest\n");
}
编译成mylib.o文件
gcc -c mylib.c
使用ar生成静态库
ar rcs libmy.a mylib.o
参数r:#在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用其他任选项来改变增加的位置。
参数c:#创建一个库。不管库是否存在,都将创建。
参数s:#创建目标文件索引,这在创建较大的库时能加快时间。
调用静态库
8 调用静态库
使用静态库编译
gcc -o test test.c libmy.a