static and dynamic
/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)由于使用了共享库,库里的方法并没有包含在内,所以程序较小。