static and dynamic

来源:互联网 发布:淘宝情侣装店铺名字 编辑:程序博客网 时间:2024/05/29 11:04

/usr/bin:用户自己安装的程序

/usr/include:用户的头文件

/usr/lib:用户自己的库文件        /lib:系统的库文件



库:预先编译好的方法的集合


函数库分为静态库动态库两种

静态库在程序编译时会被链接到目标代码中,程序运行时将不再需要该静态库

静态库是以lib为前缀,紧接着跟静态库名,扩展名为.a

eg:libxxx.a

创建静态库步骤

1.先生成.o文件

2.ar  crv  libxxx.a   fun.o(可多个) 

3.gcc  -o  main  main.c  -L路径  -l库名

eg:gcc  -o  main  main.o  -L.  -lfun(当前路径下的库,库名为fun)


把库放到标准目录下,可省去路径

eg:gcc  -o  main  main.c  -l库名


动态库在程序编译时不会被链接到目标代码中,而是在程序运行时才被载入,因此在程序运行时还需要动态库存在

动态库库名前加lib前缀,其扩展名为.so

eg:libxxx.so

创建共享步骤

1.先生成.o文件

2.ar  crv  libxxx.so   fun.o(可多个) 

3.gcc  -shared  -fPIC libfun.so fun.o(可多个)

或:gcc -shared -fPIC libfun.so fun.c(可多个)

或:gcc -shared -fPIC fun.c(可多个) -o libfun.so

注意:共享库运行时要指明库的存储路径,用户自定义的库,系统默认不找,运行时要把库包含进来

(cp libfoo.so /usr/lib)执行这句需要管理员权限


静态库动态库同名,先使用动态库


ldd 可以看到用到哪些库




1、静态库

 

1)如果主机上没有libfoo.a,那么main程序能不能执行?

     答:可以执行。因为main程序中已经有add方法(函数)了。

2)如果libfoo.a库更新了,需要将原来的main.c重新编译吗?

     答:需要将main.c重新编译生成可执行程序。

3)由于使用了静态库,库里的方法已经包含在可执行程序中了,所以程序比较大

 

2、共享库

 

1)如果主机上没有libfoo.so,那么main程序能不能执行?

     答:不可以执行 ./main运行程序的时候去装载add方法。

2)如果libfoo.so库更新了,需要将原来的main.c重新编译吗?

     答:main.c不需要重新编译,可以直接使用新库。

3)由于使用了共享库,库里的方法并没有包含在内,所以程序较小