ChinaUnix首页 > 精华文章 > C/C++ > 正文

[精彩] 如何编译动态库


http://www.chinaunix.net 作者:闲聊101306  发表于:2006-01-11 10:44:32
发表评论】 【查看原文】 【C/C++讨论区】【关闭

我源文件为main.c, x.c, y.c, z.c,头文件为x.h,y.h,z.h
如何编译成.so动态库?
编译器用gcc
最好能给出详细参数解释,谢谢



 bluesoho 回复于:2004-07-25 10:52:14

# 声称动代连接库,假设名称为libtest.so
gcc x.c y.c z.c -fPIC -shared -o libtest.so

# 将main.c和动态连接库进行连接生成可执行文件
gcc main.c -L. -ltest -o main

# 输出LD_LIBRARY_PATH环境变量,一边动态库装载器能够找到需要的动态库
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

# 测试是否动态连接,如果列出libtest.so,那么应该是连接正常了
ldd main

# 执行就不用说了吧

--------------------------------------------------
建议创建一个Makefile来作这些事情。


 bluesoho 回复于:2004-07-25 11:00:29

-fPIC:表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的。

-L.:表示要连接的库在当前目录中

-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称

LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。
当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用
/sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。


 闲聊101306 回复于:2004-07-25 11:01:59

十分感谢


 eagerly1 回复于:2004-07-25 20:39:00

收藏了


 jsean 回复于:2004-07-27 13:05:07

收藏!


 FH 回复于:2004-07-27 13:19:14

什么呀,就收藏?对么?环境是什么?编译器是什么?连接器又是什么?


 kurapikar 回复于:2004-07-27 13:21:42

想问个问题 连接器是指?


 jsean 回复于:2004-07-28 12:26:03

引用:原帖由 "FH"]什么呀,就收藏?对么?环境是什么?编译器是什么?连接器又是什么?
 发表:



FH给大家一个更有说服力和更有收藏价值的相关说明吧,先谢了,呵呵


 FH 回复于:2004-07-28 13:14:11

最有价值的就是在你自己的环境下:
man cc/gcc/...
man makefile
man make

因为上文所说的各个参数,对不同的环境可能是完全不一样的。

顺便说一下,连接器是ld。


 roking 回复于:2004-07-28 15:29:02

好帖子,支持:)
但是我看好多书上都写着要在/etc/ld.so.conf 里要配置一下,不知道是什么意思,因为我在solaris8上没有找到这个文件,能解释一下吗??

谢谢:)


 hzluly 回复于:2004-07-28 23:26:30

bluesoho,不错


 bluesoho 回复于:2004-07-29 00:47:05

引用:原帖由 "hzluly"]bluesoho,不错
 发表:



谢谢!
我也是beginner, 各位高位清多指教


 FH 回复于:2004-07-29 10:30:54

引用:原帖由 "jsean" 发表:


FH给大家一个更有说服力和更有收藏价值的相关说明吧,先谢了,呵呵


其实,花点功夫在精华区里找一下,就有各种环境的选项说明的。


 pqxpqx 回复于:2006-01-11 10:44:32

不错,支持 !




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=373418
转载请注明作者名及原文出处