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

来源:互联网 发布:html 获取js定义的值 编辑:程序博客网 时间:2024/05/18 12:42

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.ohow.o:how.c  gcc -c how.c -o how.olibgreet.a:hellow.o how.o  ar -rcs libgreet.a hellow.o how.orun:main.c libgreet.a  gcc main.c -L. -lgreet -o run
  • 运行make run
[root@izhqmn61154vmrz libTest]# make rungcc -c hellow.c -o hellow.ogcc -c how.c -o how.oar -rcs libgreet.a hellow.o how.ogcc main.c -L. -lgreet -o run
  • 运行run
[root@izhqmn61154vmrz libTest]# ./runhellow worldhow 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.ogcc main.o -L../libs -lhellow -o main
  • 运行
[root@izhqmn61154vmrz libTest]# ./mainhellow you

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

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/libs

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

原创粉丝点击