库
- Linux下库的种类
- 静态库:
- 在程序编译的时候会被链接到目标代码里面。程序运行时便不再需要该静态库。编译出来的体积较大。
- 命名方式:以
lib
开头,以.a
结尾。 - 使用场景:频繁移植时,使用静态库较好,移植程序时方便,不需要再将各种库拷贝过去。
- 动态库(共享库):
- 在程序编译的时候不会被链接到目标代码里面。程序运行时仍然需要该动态库。
- 命名方式:以
lib
开头,以.so
结尾。 - 使用场景:有多个程序包含同一些库时,使用动态库。
静态库的制作
/**** 制作步骤 ****/
1. 编写或准备库的源代码
2. 将源码.c文件编译成.o文件
3. 使用ar命令创建静态库
4. 测试库文件
>> gcc -c StaticLibs.c
> StaticLibs.o // 得到了.o文件
>> ar cr libStaticLibs.a StaticLibs.o // cr:create replay
> libStaticLibs.a // 得到了静态库文件
>> gcc test.c -lStaticLibs -L . // -l:后面跟的是静态库的名字。
// -L:指定静态库的查找位置。-L. 表示在当前目录下去查找。
动态库的制作
/**** 制作步骤 ****/
1. 编写或准备库的源代码
2. 将源码.c文件编译成.o文件
3. 使用gcc命令创建静态库
4. 测试库文件
>> gcc -c -fpic DynamicLibs.c
> DynamicLibs.o
>> gcc -shared -o libDynamicLibs.so DynamicLibs.o
> libDynamicLibs.so
>> gcc test.c -lDynamicLibs -L.
> a.out
>> ./a.out
> ./a.out: error while loading shared libraries: libStaticLibs.so: cannot open shared object file: No such file or directory
这是因为系统会默认去/lib,/usr/lib目录下去查找动态函数库。
第一种方法:
将生成的动态库拷贝到/lib或者/usr/lib里面去,因为系统会默认去这俩个路径下寻找。
第二种方法:
把我们的动态库所在的路径加到环境变量里面去。
第三种方法:
修改ubuntu下的配置文件/etc/ld.so.conf,我们在这个配置文件里面加入动态库所在的位置,然后使用命令ldconfig更新目录。
这里使用第二种办法:
>> pwd
> /home/xxxxx
>> export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/zs/linux/nfs/13
// 应该在root用户下添加变量,否则会提示权限不够。
之后即可执行a.out。
但是只在当前终端下有效!