linux 静态库与动态库

Linux静态库与动态库

静态库与动态库的区别:

静态库:

  • 静态库后缀为 .a 例如 libxxx.a
  • 静态库是在程序编译时链接库文件,程序编译后即使删除库文件源码也不影响程序使用。

动态库(共享库):

  • 动态库的后缀为 .so 例如 libxxx.so
  • 动态库是在程序执行时去链接库文件,程序在执行的时候依然依赖库文件,若删除库文件程序将无法正常执行。

库文件的制作:

main.c 代码如下:

#include <stdio.h>
int main(int argc, const char *argv[])
{
	func();
	return 0;
}

func.c代码如下:

#include <stdio.h>
void func()
{
	printf("Hello World!\n");
}

func.h代码如下

#ifndef __FUNC__H_
#define __FUNC__H_
void func(void);
#endif

如何制作静态库:

将封装函数的代码编译生成执行程序的依赖文件(.o-可重定向文件):

gcc -c func.c -o func.o

生成静态库: (库名:func , lib表示该文件为库文件 , .a表示这个一个静态库)

ar crs libfunc.a func.o

使用静态库:(链接库文件使用-l命令 , -L表示库文件的路径)

gcc main.c -o main -lfunc -L.
linux@ubuntu:~/sourcecode/test$ ls
func.c  func.h  func.o  libfunc.a  main  main.c
linux@ubuntu:~/sourcecode/test$ ./main 
Hello World!

如何制作动态库:

1)将封装函数的代码编译生成执行程序的依赖文件(.o-可重定向文件)-fPIC 在程序执行时,将库保存在合理的内存空间(自动分配)

gcc -c -fPIC func.c -o func.o

2)生成动态库(-shared 生成动态库 )

gcc -shared func.o -o libfunc.so
linux@ubuntu:~/sourcecode/test$ ls
func.c  func.h  func.o  libfunc.so  main.c
linux@ubuntu:~/sourcecode/test$ 

动态库使用的三种方法:

  • 将动态库保存在存放动态库的文件中(/lib/ 或者/usr/lib/)
linux@ubuntu:~/sourcecode/test$ sudo cp libfunc.so /lib/
linux@ubuntu:~/sourcecode/test$ gcc main.c -o main -lfunc
linux@ubuntu:~/sourcecode/test$ ./main 
Hello World!

或者

linux@ubuntu:~/sourcecode/test$ sudo cp libfunc.so /usr/lib/
linux@ubuntu:~/sourcecode/test$ gcc main.c -o main -lfunc
linux@ubuntu:~/sourcecode/test$ ./main 
Hello World!
  • 通过环境变量申明动态库的路径 使用export命令将库文件的路径到出到环境变量 LD_LIBRARY_PATH。
linux@ubuntu:~/sourcecode/test$ export LD_LIBRARY_PATH=/home/linux/sourcecode/test/
linux@ubuntu:~/sourcecode/test$ gcc main.c -o main -lfunc
linux@ubuntu:~/sourcecode/test$ ./main 
Hello World!
  • 用户自定义配置文件申明动态库的路径
    linux中有一个关于库文件的配置文件,在/etc/ld.so.conf.d/添加一个自定义的以.conf为后缀的文件,在文件中制定库的路径。
linux@ubuntu:~/sourcecode/test$ cd /etc/ld.so.conf.d/
linux@ubuntu:~/sourcecode/test$ sudo vi func.conf

如图
保存并推出, 刚刚添加好的.conf文件需要使用ldconfig命令刷新一下 刷新库文件后 重新执行即可。

linux@ubuntu:~/sourcecode/test$ sudo ldconfig
linux@ubuntu:~/sourcecode/test$ ls
func.c  func.h  func.o  libfunc.so  main  main.c
linux@ubuntu:~/sourcecode/test$ ./main 
Hello World!
linux@ubuntu:~/sourcecode/test$ 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值