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 中。

你可能感兴趣的:(gcc,c语言,centos,动态库,静态库)