Linux 动态链接和静态链接简析

原文请见 Linux动态链接和静态链接简析

1. 生成静态链接库

gcc -c h.c -o h.o
ar cqs libh.a h.o
  • ar是生成库的命令,
  • cqs是参数,
  • libh.a是生成的静态链接库须以lib开头,h是库名,
  • a表示是静态链接库,h.o是刚才生成目标文件

2. 生成动态链接库

gcc -c h.c -o h.o

生成动态链接库用gcc来完成

gcc -shared -WI -o libh.so h.o
  • -shared -WI是参数(WarningImplicit),
  • libh.so是生成的静态链接库须以 lib 开头,h是库名,
  • so表示是动态链接库,h.o是刚才生成目标文件

3. 将生成的libh.a,libh.so拷贝到/usr/lib或/lib下

4. 编译带静态链接库的程序

gcc -c test.c -o test.o
gcc test.o -o test -WI -Bstatic -lh
  • -WI -Bstatic表示链接静态库,
  • -lh 中 -l 表示链接,
  • h 是库名即/usr/lib下的libh.a

5. 编译带动态链接库的程序

gcc -c test.c -o test.o
gcc test.o -o test -WI -Bdynamic -lh
  • -WI -Bdynamic表示链接动态库,
  • -lh中-l表示链接,
  • h是库名即/usr/lib下的libh.so

6. 运行。/test得到结果

有些库形如 libh.so.1.0, 1.0 表示版本号。若要使用该库,通常要建立一个软连接,用 ln -s libh.so.1.0 libh.so. 系统不知道1.0为何意思。

7. 其他知识

编译连接时同时要用动态和静态链接库,则用如下命令

gcc test.o -o test -WI -Bstatic -lh1 -WI -Bdynamic -lh2

8.动态库和静态库的位置问题

把动态库或者静态库放在/usr/lib或者/lib下,在链接的时候系统会自动到这两个目录下寻找。如果没有放在这两个目录下,则修改/etc/ld.so.conf文件,把目录写入该文件,然后ldconfig,就OK了。

如果没有放在usr/lib或者/lib目录下,也不修改/etc/ld.so.conf文件,也可以在编译的时候加上 -L/路径 也可以。但是在执行的时候还是会提示找不到库的所在。

你可能感兴趣的:(Linux 动态链接和静态链接简析)