C中静态库和动态库的使用

1.自定义头文件
在C中,编写的头文件如果不在标准头文件目录中是无法使用尖括号包括的,只能使用""包括,例如:
    #include"目录/头文件名"
或者如果头文件在需要编译的文件的当前目录下,可以不用加目录名
    #include"头文件名"
2.使用尖括号包括
如果要使用尖括号包括头文件,有两种方法
    1.将头文件移动到标准头文件目录,linux为/usr/local/include.windows下为C:\MinGW\include
    2.编译时指定头文件目录,gcc -I/头文件目录 ...... 编译时-I参数就是用于指定头文件目录
3.静态库
将文件编译为静态库,可以将多个目标文件保存为一个存档,在linux中存档命令为"ar",例如
    ar -rcs libmylib.a source1.o source2.o
参数r表示如果.a文件存在,则更新它,c表示创建存档时不反馈信息,s表示在.a文件开头建立索引,文档名必须以lib开头,否则编译器无法找到该存档
    编译时使用静态库的方法为使用-l参数,如果该静态库处在标准目录(linux下为/usr/local/lib)中,则无需指定目录,如果不在标准目录中,需要使用-L参书指定静态库所处的目录,例如
    gcc test.c -L/my_lib -lmylib -o test
3.使用静态库实例
    创建头文件hellow.h,how.h,c文件hellow.c,how.c,main.c,以及一个Makefile文件
  • hellow.h
void hellow();
  • how.h
void how();

做完之后可以将两个头文件移动到标准头文件目录下,如果不移动,后面的makefile文件需要使用-I参数,指定头文件目录为当前目录

  • hellow.c
#include<hellow.h>
#include<stdio.h>

void hellow()
{
  printf("hellow world\n");
}
  • how.c
#include<how.h>
#include<stdio.h>
void how()
{
  printf("how are you\n");
}
  • main.c
#include<stdio.h>
#include<hellow.h>
#include<how.h>
int main()
{
  hellow();
  how();
  return 0;
}
  • Makefile文件
#include<hellow.h>
#include<how.h>

hellow.o:hellow.c
  gcc -c hellow.c -o hellow.o
how.o:how.c
  gcc -c how.c -o how.o
libgreet.a:hellow.o how.o
  ar -rcs libgreet.a hellow.o how.o
run:main.c libgreet.a
  gcc main.c -L. -lgreet -o run
  • 运行make run
[root@izhqmn61154vmrz libTest]# make run
gcc -c hellow.c -o hellow.o
gcc -c how.c -o how.o
ar -rcs libgreet.a hellow.o how.o
gcc main.c -L. -lgreet -o run
  • 运行run
[root@izhqmn61154vmrz libTest]# ./run
hellow world
how are you
  • 由上面的实例可以看出,静态库是由不同的目标代码组件而成的,需要先编译.o文件,再创建.a文档,再将它们链接成可执行程序,一旦用这些独立的目标代码创建了可执行程序,就没办法修改组成静态库的目标文件,除非重新编译.o文件,创建.a文档…,这也是它被称为静态库的原因
4.动态库
静态库在生成执行文件后无法修改组成执行文件中的目标代码,而动态库通过将目标代码分别保存在单独的文件中,在程序运行时才将之动态的链接到一起,从而实现了可以修改目标文件的目的
  • 创建动态库

    将目标代码转换为动态库之前,需要先将它编译为.o目标文件:
    
        gcc -fPIC -c source.c -o source.o
    -fPIC表示想创建位置无关代码,在linux中必须加这个参数,然后创建动态库
        gcc -shared source.o -o source.so
    -shared选项将.o文件转化为动态库,在linux中动态库被称为共享目标文件,后缀名为.so,而在windows中,动态库被称为动态链接库,后缀名为.dll
  • 动态库使用实例

    创建头文件hellow.h,c文件hellow.c,main.c将头文件放在上一级目录的includes目录中,同时创建libs目录,文件内容与静态库使用的文件相同
    
  • 将hellow.c文件编译为.o文件
gcc -I../includes -fPIC -c hellow.c -o hellow.o
  • 将.o文件编译为动态库文件
gcc -shared hellow.o -o ../libs/libhellow.so
  • 链接main函数程序
gcc -I../includes -c main.c -o main.o
gcc main.o -L../libs -lhellow -o main
  • 运行
[root@izhqmn61154vmrz libTest]# ./main
hellow you

在linux中,需要将自定义的lib目录导入变量LD_LIBRARY_PATH中,所以在创建libs文件夹后,需要执行

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/libs

后才能运行,否则会显示找不到动态库

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值