静态库的特点:静态库在程序编译时会连接到目标代码中,造成代码臃肿,程序运行时则不再需要静态库。
如何制作静态库?
1、将所需的c文件编译生成.o文件
gcc xxx.c -o xxx.o -c -Wall
(note:xxx为任意名,改为自己对应的文件名。)
2、将.o文件编译成静态库文件
ar crs libxxx.a xxx.o
如何链接、使用静态库?
gcc test.c -o test -L. -lxxx -static
-L指定对应路径寻找库文件,若无则在默认库路径寻找(所以可将库文件移动到自定义的目录下);
-lxxx xxx为静态库名如:libxxx.a,其库名为xxx;
-static 表明链接的是静态库
动态库的特点:将库函数的链接推迟至程序运行时;可以实现多个程序共享一个库的资源(因此也称共享库);
如何制作动态库?
1、将所需的c文件编译生成.o文件
gcc xxx.c -o xxx.o -c -Wall -fPIC
(-fPIC 表明生成与位置无关的文件)
2、将.o文件编译成动态库文件
gcc xxx.o -o libxxx.so.[num] -shared
([num]为版本号如:libxxx.so.1;可无,则为:libxxx.so)
3、为动态库文件创建链接文件
ln -s libxxx.so.[num] libxxx.so
如何链接、使用动态库?
gcc test.c -o test -L. -lxxx
问题解决:
若使用动态库链接的程序,运行时出现这个情况:
是因为系统没有找到库文件,系统默认是去/lib和/user/lib中寻找动态库文件;解决方法有三个。
一、将库文件放在系统默认寻找的目录下,即/lib和/user/lib下(不建议)
二、临时改变环境变量来增加路径,新开的shell就会失效
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
三、改变配置文件来增加路径,一直可用
有两种方法可达成,选一即可。
1、在终端上输入sudo gedit ~/.bashrc,在最后一行加入
Export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
保存退出,终端执行Source ~/.bashrc,重新加载脚本文件
使用echo $LD_LIBRARY_PATH,可看环境变量是否添加成功。
再次执行程序,应该就没问题了
2、在/etc/ld.so.conf.d里添加一个xxx.conf文件(xxx为自定义的名字);
xxx.conf中添加库文件的存放目录
保存退出后,在终端输入以下命令进行刷新:
sudo ldconfig
现在执行程序也应该没问题了