设为首页 加入收藏

TOP

GCC 静态库和动态库
2014-11-24 12:49:18 来源: 作者: 【 】 浏览:0
Tags:GCC 静态 动态

其中 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 :


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


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


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


】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Python调用MySQLdb插入中文乱码的.. 下一篇一行Shell命令搞定在Java源文件中..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·如何利用Python做数 (2025-12-24 23:48:36)
·如何使用python进行 (2025-12-24 23:48:34)
·python 爬虫入门该怎 (2025-12-24 23:48:31)
·Java 实现多个大文件 (2025-12-24 23:22:00)
·Java多线程编程在工 (2025-12-24 23:21:56)