转自GCC 静态库和动态库

//hello.c
#include void print_hello()
{
printf("HelloWorld ");
} //main.c
#include
#include "hello.h" int main()
{
print_hello();
printf("%d",HELLO);
return 0;
} //hello.h
#define HELLO 9999
void print_hello();

其中 hello.c 和 main.c 在同一个目录下, hello.h在上一个目录。

先生成 xxx.o 文件

$ gcc hello.c -c ==> hello.o

$ gcc main.c -c ==> error : no hello.h

$ gcc main.c -c -I ../ ==> main.o -I 指定头文件的搜索目录( I 是大小的 i)

$ ls ==> hello.o main.o hello.c main.c

静态库的生成

$ ar cr libhello.a hello.o ==> libhello.a (注意顺序)

静态库的使用

$ gcc main.o -o main.out -lhello==> error : /usr/bin/ld: cannot find -lhello,意思是找不到库 -l 是小写的L

1.linux下默认gcc搜索是按照LD_LIBRARY_PATH来搜索的,标准库(动态库和静态库)都在 /usr/lib/ 下面

2.-lhello是一种约定,表示搜索 libhello.a 或者 libhello.so 的库,-lXXXX
即 libXXXX.a 或者 libXXXX.so

3. 可以用 -L 来指定加载库的目录

$ gcc main.o -o main.out -L . -lhello ==>出现了main.out,成功!

静态库的测试

$ rm libhello.a -f ==>程序照样能运行,说明静态库是链接进程序的!

动态库的生成

$ gcc hello.o -o libhello.so -shared ==> libhello.so

动态库的使用

$ gcc main.o -o main.out -L . -lhello ==> -L指定库所在路径,-lhello指定libhello.a
或者 libhello.so

$ ./main.out ==> error while loading shared libraries: libhello.so: cannot open shared object file: No such file                    or directory

动态链接库是在程序运行时候去加载的,加载的时候是从标准目录/usr/lib下去寻找的,下面是三种解决方法

1. $ cp libhello.so /usr/lib/ ==> libhello.so拷贝到/usr/lib/下去

2. export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

// export LD_LIBRARY_PATH=$LD_LIBRARY_PATH : <path of libxxxx.so>

3 . /etc/ld.so.conf 里面加一行所在库的目录,然后执行 ldconfig

/etc/ld.so.conf文件:除了标准目录(/lib和/usr/lib)之外,链接器和加载器搜索共享库时要检查的其他目录,和这个文件相关的一个命令是:ldconfig

动态库的测试

$ rm libhello.so ==>运行的时候出错,说明程序运行的时候需要库!

最新文章

  1. Android Fragment 真正的完全解析(下)
  2. Android GUI系统
  3. STL--双端队列(deque)和链表(list)
  4. 创建Car类,实例化并调用Car类计算运输的原料量是否足够
  5. iOS关于rar解压第三方库Unrar4iOS使用总结
  6. [JavaScript] 初中级Javascript程序员必修学习目录
  7. 如何在Windows中打开多个Windows Media Player
  8. js动态删除div元素
  9. STDMETHOD_,STDMETHOD,__declspec(novtable)和__declspec(selectany)
  10. sshd安全性能优化
  11. 面向对象S.O.L.I.D原则
  12. [Swust OJ 403]--集合删数
  13. PAT乙级1034. 有理数四则运算(20)
  14. AndroidManifest.xml文件
  15. centos 7 部署Thinksns
  16. Cetnos搭建vsftp服务器
  17. 三十天学不会TCP,UDP/IP网络编程-IP头格式祥述
  18. 新概念英语(1-103)The French Test
  19. java Concurrent并发容器类 小结
  20. ILMerge在MSBuild与ILMerge在批处理文件中运行

热门文章

  1. 【Newtonsoft.Json】Window Phone Json解析开发包
  2. 初测WIN10
  3. OS X EI Capitan安装mcrypt
  4. http 错误编号大全(转)
  5. select标签用法
  6. java中print\println\printf的区别
  7. XenServer安装虚拟机---先扩容存放ISO镜像文件
  8. JNI-入门之二
  9. LCA专题
  10. Halcon学习笔记之缺陷检测(二)