这里我记录的是曾经踩过的坑, 主要是生成和使用, 优缺点等理论内容不说.
引子
linux平台下, 目标文件分为3种:
- 可重定向目标文件
- 可执行目标文件
- 共享目标文件(共享库)
这里从第三种入手, 讲讲linux下的库的生成和使用, 文章很短.
正文
静态库
生成静态库:1
ar src libtest.a xx.o yyy.o (相当于一个简单的打包过程)
使用静态库:1
2
3
4
5gcc main.c -ltest.a -o main
/*或者*/
gcc -L. main.c -o main
/*或者*/
gcc main.c -static ./test.a -o app
后2种指定当前库的搜索路径为当前目录, 推荐使用 -static
选项.
动态库
生成一个动态库:libtest.so1
$ gcc -shared -fPIC test_a.c test_b.c test_c.c -o libtest.so
相关选项说明:
-shared
该选项指定生成动态连接库(让连接器生成T类型的导出符号表, 有时候也生成弱连接W类型的导出符号)不用该标志外部程序无法连接, 相当于生成一个可执行文件.-fPIC
表示编译为位置独立的代码, 不用此选项的话编译后的代码是位置相关的, 所以静态库载入时是通过代码拷贝的方式来满足不同进程的需要, 而不能达到真正代码段共享的目的.
使用动态库:1
gcc test.c -L. -ltest -o test
使用时-l一定放在源文件之后.
测试是否动态链接了动态库:1
ldd test
但是生成的可执行文件, 在运行的时候也要能找到相关运行库才可以.
LD_LIBRARY_PATH
这个环境变量指示动态连接器可以装载动态库的路径; 当然如果有root权限的话, 可以修改 /etc/ld.so.conf
文件, 然后调用 /sbin/ldconfig
来达到同样的目的,不过如果没有root权限, 那么只能采用 export LD_LIBRARY_PATH
, 如果找不到加载路径, 通常会在运行时报错找不到符号xxx
.
尾巴
最初学习 linux c
的时候学习的该内容, 现在复习起来也别有一番乐趣.
who is sponsoring the site? - i shall say merlin (wizardmerlin945@gmail.com
)
欢迎发邮件给我(生活问题,请高抬贵手)