有关动态库和静态库的生成和加载

来源:互联网 发布:淘宝网金丝绒连衣裙 编辑:程序博客网 时间:2024/05/16 07:51

 有关环境变量:

LIBRARY_PATH环境变量:指定程序静态链接库文件搜索路径

LD_LIBRARY_PATH环境变量:指定程序动态链接库文件搜索路径

静态库链接时搜索路径顺序:

1. ld会去找GCC命令中的参数-L

2. 再找gcc的环境变量LIBRARY_PATH

3. 再找内定目录 /lib /usr/lib /usr/local/lib 这是当初compile gcc时写在程序内的


动态链接时、执行时搜索路径顺序:


1.  编译目标代码时指定的动态库搜索路径;

2.  环境变量LD_LIBRARY_PATH指定的动态库搜索路径;

3.  配置文件/etc/ld.so.conf中指定的动态库搜索路径;

4. 默认的动态库搜索路径/lib;

5. 默认的动态库搜索路径/usr/lib。


  默认情况下,gcc会自动搜索下面的路径:
对头文件:
/usr/local/include/
/usr/include/
对库文件:
/usr/local/lib/
/usr/lib/

编译参数解析


最主要的是GCC命令行的一个选项:
-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件
l -fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。
l -L.:表示要连接的库在当前目录中
l -ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称
l LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
l 当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。

调用动态库的时候有几个问题会经常碰到,有时,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过 “-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,就是死活找不到你指定链接的so文件,这时你要作的就是通过修改 LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。


生成动态库:

[root@localhost moduletest]# ls
hello.c  hello.h  hello.o  main.c
[root@localhost moduletest]# gcc -shared -fPIC -o libmyhello.so hello.o
[root@localhost moduletest]# ls
hello.c  hello.h  hello.o  libmyhello.so  main.c
[root@localhost moduletest]# gcc main.c libmyhello.so -o main或gcc main.c -L. -lmyhello  -o main
[root@localhost moduletest]# ls
hello.c  hello.h  hello.o  libmyhello.so  main  main.c
[root@localhost moduletest]# ./main
./main: error while loading shared libraries: libmyhello.so: cannot open shared object file: No such file or directory

解决办法:
1.[root@localhost moduletest]# mv libmyhello.so /usr/lib(需root权限)

2.[root@localhost moduletest]# export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH
3.修改相关的系统配置文件:
     修改/etc/ld.so.conf,然后利用/sbin/ldconfig来完成。 


    当静态库和动态库同名时, gcc命令将优先使用动态库。

动态库的搜索路径搜索的先后顺序是:
  
1.编译目标代码时指定的动态库搜索路径;
2.环境变量LD_LIBRARY_PATH指定的动态库搜索路径; 

3.配置文件/etc/ld.so.conf中指定的动态库搜索路径;
4.默认的动态库搜索路径/lib    /usr/lib。


生成静态库:

[root@localhost moduletest]# ls
hello.c  hello.h  main.c 
[root@localhost moduletest]# gcc -c hello.c
[root@localhost moduletest]# ls
hello.c  hello.h  hello.o  main.c
[root@localhost moduletest]# ar crv libmyhello.a hello.o
a - hello.o
[root@localhost moduletest]# ls
hello.c  hello.h  hello.o  libmyhello.a  main.c
[root@localhost moduletest]# gcc main.c libmyhello.a -o main 或gcc main.c -L. -lmyhello  -o main
[root@localhost moduletest]# ./main 
hello everyone! 
[root@localhost moduletest]# rm -f libmyhello.a 
[root@localhost moduletest]# ls
hello.c  hello.h  hello.o  main  main.c
[root@localhost moduletest]# ./main 
hello everyone! 

原创粉丝点击