LINUX 静态库与动态库
1.静态库与动态库
静态库:
1.用户自己写的外部调用库文件;
2.静态库代码编译完成,通过链接文件直接嵌入可执行文件中;
3.静态库更新后需要重新编译库文件再链接;
动态库:
1.便于更新;
2.执行文件体积小;
3.多个执行文件可以指向同一个动态库;
2.静态库
创建静态库:相当于自己写一个库文件用于函数的调用;
此处写出 add.c 和 add.h 文件,用于执行文件main的调用,库文件与执行文件默认在同一文件夹下;
步骤1:编写静态库代码 add.c add.h
add.c
#include <stdio.h>
#include "add.h"
void add(void)
{
printf("33333333333\n");
return;
}
void hello(void)
{
printf("hello world\n");
return;
}
add.h
#ifndef __ADD_H
#define __ADD_H
#include <stdio.h>
void add(void);
// int my_add(void);
void hello(void);
#endif //__MY_HELLO_H
步骤2:生成静态库可执行文件add.o
gcc -c add.c
或者
gcc -c add.c -o add.o
步骤3:根据add.o生成静态库文件 libadd.a
ar crs libadd.a add.o
或者
ar -cr libadd.a add.o
步骤4:libadd.a 嵌入到main可执行文件中
gcc main.c -ladd -L. -o mian
或者
gcc main.c -L./path_to_lib -lmylib -o main(输入lib文件路径)
注意,为避免文件编译时错误,即使调用add.h头文件,最好在可执行文件代码中main函数前加入引用声明:
#include <stdio.h>
#include "add.h"
void add(void);
void hello(void);
int main(int argc, const char *argv[])
{
// my_hello("zhangsan");
add();
hello();
return 0;
}
3.动态库
步骤1:编写动态库代码 addf.c addf.h
addf.c
#include <stdio.h>
#include "addf.h"
void addf(void)
{
return 1+5;
}
void hello(void)
{
printf("hello world\n");
return;
}
步骤2:生成与位置无关的目标文件
gcc -c -fPIC addf.c
或者
gcc -c -fPIC addf.c -o addf.o
步骤3:根据addf.o生成动态库文件 libaddf.so
gcc -shared addf.o -o libadd.so
步骤4:libadd.so 链接到可执行文件中
gcc main.c -laddf -L. -o my_addf
步骤5:符号链接的几种方法
- export LD_LIBRARY_PATH=$PWD (PWD表示当前路径)
- 转存库路径:
系统级库路径: /usr/lib
个人库路径:/usr/local/lib
使用mv 命令转存,而后执行更新缓存命令 ldconfig

更多推荐




所有评论(0)