Linux之静态库共享库

Posted bo1990

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux之静态库共享库相关的知识,希望对你有一定的参考价值。

一、静态库和共享库的区别

  • 静态库在编译的时候被加载,而共享库在执行之后才被加载
  • 加载静态库编译所生成的可执行文件比使用共享库的方式要大
  • 静态库以.a为后缀,共享库以.so为后缀

二、静态库的制作

  • gcc -c add.c sub.c(编写源文件,gcc -c命令生成对应的目标文件add.o和sub.o)
  • ar crs -o libmath.a add.o sub.o(ar命令归档目标文件,生成静态库libmath.a)
  • gcc mian.c -L. -lmath(链接静态库libmath.a,编译生成可执行文件a.out)

三、动态库的制作

  • gcc -c add.c sub.c(编写源文件,gcc -c命令生成对应的目标文件add.o和sub.o)
  • gcc -fPIC-shared -o libmath.so add.o sub.o(-fPIC方式生成共享库文件libmath.so)
  • gcc main.c -L. -lmath(链接共享库libmath.so,编译生成可执行文件a.out)

注意:在gcc编译生成可执行文件的时候,默认链接系统的共享库,但如果添加了-static选项则链接了系统的静态库,可执行文件会大很多

应用程序找共享库的方式有四种:

  • 环境变量LD_LIBRARY_PATH指定的共享库搜索路径
  • 配置文件/etc/ld.so.conf中指定的共享库搜索路径(include /etc/ld.so.conf.d/*.conf)
  • 默认的共享库搜索路径/lib
  • 默认的共享库搜索路径/usr/lib

四、gcc命令常用选项

  • -c(只生成可重定位目标文件.o)
  • -o filename(指定输出文件的名字为filename)
  • -g(生成调试信息,供gdb使用)
  • -static(对于支持动态链接的系统,使用静态链接而不是动态链接)
  • -I path(头文件包含目录,即在path目录下寻找相关的include文件)
  • -L path(库文件包含目录,即在path目录下寻找相关的库文件)
  • -lxx(链接库libxx.a或者libxx.so,比如若链接libm.so库则写成-lm)
  • -std=xx(指定编译的语言标准,比如-std=c99或-std=c11)
  • -Wall(输出错误和警告)
  • -Werror(将警告视为错误输出)
  • -Wl,option(将参数option作为后续链接器ld的参数)
  • -Wl,rpath=path(指定非默认的共享库搜索路径,运行该程序时会在-rpath指定的目录下寻找共享库.so文件)

头文件来源:-I路径--->环境变量(C_INCLUDE_PATH、CPLUS_INCLUDE_PATH、OBJC_INCLUDE_PATH)--->内定目录(/usr/include、/usr/local/include等)

库文件来源:-L路径--->环境变量(LIBRARY_PATH)--->内定目录(/lib、/lib64、/usr/lib、/usr/lib64、/usr/local/lib、/usr/local/lib64)

五、未完待续~

以上是关于Linux之静态库共享库的主要内容,如果未能解决你的问题,请参考以下文章

linux 静态库共享库

linux 静态库共享库

Linux之静态库与动态库20160706

Linux静态库和共享库

Linux 静态库和共享(动态)库的创建与使用详解

静态库和共享库