liunx c制作静态库,动态库
制作静态库
原料:
头文件: 包含了函数的声明。例如:head.h
#ifndef HEAD_H_
#define HEAD_H_
int add(int a,int b);
int sub(int a,int b);
#endif
源文件:
add.c 文件
#include "head.h"
int add(int a,int b)
{
return a+b;
}
sub.c
#include "head.h"
int sub(int a,int b)
{
return a-b;
}
命令:
1、需要将源文件编译成 ".o"文件:
gcc *.c -c -I 头文件目录
-I(i 的大写) 指定头文件路径
*.c 需要做成静态库的原文件。
2、将".o"文件进行打包:
ar rcs libname.a *.o
说明:
libname.a 即静态库的命名规范。必须以"lib"开头 以".a"结尾,中间的name位置的字符可以定制。
3、查看打包的静态库中的内容:
nm libname.a
静态库使用
gcc main.c -I 头文件路径 -L 库文件所在路径 -l 库的名字 -o 声明的可执行文件名
-I(i 大写) 指定头文件路径
-L 指定库路径
-l(小写的l) 指定库的名字。例如 库的名字为libtest.a ,只需要指定为 test(去掉lib 和 .a)
-o : 输出的可执行文件的名称。
制作动态库
命名规则:
libxxx.so 只有xxx是可以定制的。
制作:
1、需要将源文件编译成.o 文件。
gcc *.c -c -fpic(-fPIC)
与制作静态库不同的是,需要额外的添加-fpic参数,加-fPIC是相同的。
2、将.o 文件打包
gcc -shared *.o -o libxxxx.so
需要额外的添加-shared参数。
使用
gcc main.c -I 头文件目录 -L 库文件目录 -l 库名称 -o 可执行文件名
-I(i 大写)
-l(L 小写) :如果库是libtest.so ,库名称为test.
ldd app(可执行程序): 查看可执行程序中包含的动态库,和连接情况。
执行文件找不到库的问题。
直接执行编译好的可执行文件会报错,找不到库文件。
原因:
linux 中的动态链接库是有ld-liunx.so 来负责加载的。他会在以下的地方顺序的寻找可执行程序需要的动态库,如果找不到就会报找不到动态库的错误。
1、elf-DT-RPATH 段:不知道是什么鬼。elf文件是liunx中的可执行文件,所有的可执行文件都是这个类型。
2、在环境变量LD-LIBRARY-PATH 中查询。这个变量可以采用一下的方式设置:
1>终端中临时设置:export LD_LIBRARY_PATH=库的绝对路径:$LD_LIBRARY_PATH
2>在用户环境变量中设置
修改 ~/.bashrc
3>在系统环境变量中设置
修改/etc/profile
3、/etc/ld.so.cache文件列表
将动态库的绝对路径写到/etc/ld.so.conf 中,然后执行ldconfig -v 命令。-v 是显示执行的详细信息,可以不加。
4、/lib 或/etc/lib
直接将动态库文件放到 /lib 或 /etc/lib 中。
上一篇: no version information available问题解决
下一篇: 求助工具推荐