找回密码
 注册
查看: 1354|回复: 9

请大侠们帮帮忙,一个关于编写共享库的问题 (使我苦恼了好久)

[复制链接]
发表于 2005-8-4 14:43:41 | 显示全部楼层 |阅读模式
我这几天在做一个关于共享库的小实验。我写了一个头文件liberr.h,里面有几个关于出错i处理的函数err_re、log_re...等。也写了一个函数描述liberr.c.
然后就是建立so和连接了步骤如下:

1、建立成员(*.o)
   gcc -fPIC -g -c liberr.c -o liberr.o
2、建立so
    gcc -g -shared -Wl,-soname,liberr.so -o liberr.so.1.0.0 liberr.o
3、建立字符连接
   ln -s liberr.so.1.0.0 liberr.so.1
    ln  -s liberr.so.1.0.0 liberr.so

然后就写了一个测试函数errtest.c
    gcc errtest.c -o errtest  -L. -lerr
编译成功了


后来我把liberr.so.1.0.0 移到 /usr/lib文件甲中,并重新建立了字符连接liberr.so.1 和 liberr.so  也把/usr/lib添加到 ld.so.conf 中,接着执行ldconfig.

然后再编译
    gcc errtest.c -o errtest
却没有成功,在库里的几个函数,都显示没有定义。
为什么会这样??是不是我建立共享库的操作有问题?
还有一个问题是,库建立后还要把头文件(liberr.h)和测试文件errtest.c 放在一起吗?这样做好不合理哦,没理由要其使用这个库他用户也每次都写一个都文件。哪到底要对头文件怎样处理呢?
 楼主| 发表于 2005-8-4 14:47:48 | 显示全部楼层
还有一个问题编译的过程中是怎样根据#include<.....>找到真实的库的呢??
回复

使用道具 举报

发表于 2005-8-4 16:21:37 | 显示全部楼层
gcc errtest.c -o errtest -lerr
回复

使用道具 举报

发表于 2005-8-4 16:34:43 | 显示全部楼层
编译时gcc errtest.c -o errtest加一个-lerr;还有不要把/usr/lib放到ld.so.conf中,关于这个的说明,你可以man ldconfig

如果你的.h里有结构体的定义,而errtest.c里定义该结构体的变量的话,errtest.c就得include liberr.h;
>>还有一个问题编译的过程中是怎样根据#include<.....>找到真实的库的呢??
#include<...>,只是加入头文件,跟找函数库没有关系。之所以要include是让编译的时候能通过,而找头文件是连接的时候才干的事
回复

使用道具 举报

 楼主| 发表于 2005-8-6 18:10:01 | 显示全部楼层
谢谢两位了:)
回复

使用道具 举报

 楼主| 发表于 2005-8-6 18:12:46 | 显示全部楼层
还有一个问题是,库建立后还要把头文件(liberr.h)和测试文件errtest.c 放在一起吗?这样做好不合理哦,没理由要其使用这个库他用户也每次都写一个都文件。哪到底要对头文件怎样处理呢?可以告诉我吗?谢谢
回复

使用道具 举报

发表于 2005-8-8 18:31:33 | 显示全部楼层
我倒没觉得有什么不合理的地方,头文件写一次就行了,干嘛要每个用户又重写呢
回复

使用道具 举报

发表于 2005-8-9 16:10:32 | 显示全部楼层
如果库已经加入 /usr/lib,那么不妨把头文件加入 /usr/include 或者 /usr/include/err (最后一个子目录是你的库的名字。引用的时候就是 #include <err/liberr.h>)
回复

使用道具 举报

发表于 2005-8-9 17:35:47 | 显示全部楼层
都文件本来就是要提供给二次开发者的,你不给头文件别人怎么用你的库做二次开发?
回复

使用道具 举报

 楼主| 发表于 2005-8-10 00:57:07 | 显示全部楼层
原来是这样。mozilla大哥说得很有道理 谢谢了
谢谢wolf0403告诉我这么多,谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

GMT+8, 2025-2-8 03:11 , Processed in 0.023694 second(s), 15 queries .

© 2001-2025 Discuz! Team. Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表