LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: Illidan

链接与库的一个问题

[复制链接]
 楼主| 发表于 2005-9-26 23:16:54 | 显示全部楼层
Post by zhllg
libsipmsg.a就是你说的api编译出来的?不含有函数定义,是么?
这样肯定不行的
不用想了
最后一步连接的命令里一定要包含有定义了那些函数的.o
哪怕定义的是空函数体{}

libsipmsg.a是把我写的一部分函数打包了的库。函数定义是指?

可能是我用词不太精确。简单地说,我写了一些类似于wrapper的函数,调用了原库的一些函数。我想把那些wrapper打包成某种形式( .o也可接受,只要能行而已 ),以便其他人可以不依赖原库能进行链接从而进行测试和调试。
如果给其他人原库(不少.h和.a),恐怕未比较麻烦,所以我想只提供一个库。
你指的空函数体是?
回复 支持 反对

使用道具 举报

发表于 2005-9-27 08:49:54 | 显示全部楼层
Post by Illidan
那原来的是静态库就没办法了吗?到哪儿都得一起带着......

一般情况下只有这样做了。也可以将原静态库解开,将有关的.o文件取出来和API一起重新打包成一个新的静态库。以后只要提供这个新的静态库就行了。
回复 支持 反对

使用道具 举报

发表于 2005-9-27 09:28:00 | 显示全部楼层
Post by Illidan
那原来的是静态库就没办法了吗?到哪儿都得一起带着......


我所说的把原库编译为共享库,别人在用你的库的时候,也得有这个原库的.我上面的例子只是在别人编译的时候不需要显式地和原库链接而已.
而如果只是将自己的库公布出去,而原库不公布,那只能按照kj兄所说,把原库静态链接到自己的新库.(可能这才是你的愿意,那我一开始就没明白,因为我不认为你会认为不需要原库就能work,只是想给用户一个假象:不需要显式地链接)
回复 支持 反对

使用道具 举报

发表于 2005-9-27 09:52:31 | 显示全部楼层
Post by Illidan
libsipmsg.a是把我写的一部分函数打包了的库。函数定义是指?

extern void func();
函数声明 declaration
void func() {
...
}
函数定义 definition
回复 支持 反对

使用道具 举报

发表于 2005-9-27 09:58:21 | 显示全部楼层
Post by rickxbx

  1. [rick@Fedora-Core test]$ cat so.c
  2. int __add(int a,int b)
  3. {
  4.         return a+b;
  5. }
  6. [rick@Fedora-Core test]$ gcc -fPIC -shared so.c -o libso.so
  7. [rick@Fedora-Core test]$ su
  8. Password:
  9. [root@Fedora-Core test]# cp libso.so /lib/
  10. [root@Fedora-Core test]# cat api.c
  11. extern int __add(int,int);

  12. int _add(int a,int b)
  13. {
  14.         return __add(a,b);
  15. }
  16. [root@Fedora-Core test]# gcc -fPIC -shared -lso api.c -o libapi.so
  17. [root@Fedora-Core test]# cat test.c
  18. #include <stdio.h>

  19. extern int _add(int,int);

  20. int main()
  21. {
  22.         printf("%d\n",_add(1,2));
  23. }
  24. [root@Fedora-Core test]# gcc ./libapi.so test.c -o test
  25. [root@Fedora-Core test]# ./test
  26. 3
复制代码

这个都知道
想看你的静态连接不用共享库
回复 支持 反对

使用道具 举报

发表于 2005-9-27 12:48:00 | 显示全部楼层
Post by zhllg
这个都知道
想看你的静态连接不用共享库


1. 我的第6个回帖有错,如果原库是共享库,自己的新库作为静态库似乎不可行
2. 我的第16个回帖中的"静态"表述有错,其实我想表达的是显式(关于这一点,已经在第23帖中作了说明)
回复 支持 反对

使用道具 举报

发表于 2005-9-27 14:09:41 | 显示全部楼层
恩,看到了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-27 21:57:23 | 显示全部楼层
Post by zhllg
extern void func();
函数声明 declaration
void func() {
...
}
函数定义 definition


凭我的理解,declaration都放在header里,definition编译成.o,然后打包成library。所以你说.a里只有声明我觉得奇怪。
也有把declaration也打包进library的吗?
回复 支持 反对

使用道具 举报

发表于 2005-9-28 10:53:05 | 显示全部楼层
你的definition只是你的api的definition,你的api调用的库函数没有definition

举个例子,你写了个新的puts
<my_puts.c>
void my_puts(char *s){
puts(s);
}
</my_puts.c>
在这个文件里有你的新api - my_puts的定义,但没有puts的定义
你把它弄成了.o/.a/.so,然后给了别人
如果那个人没有libc,他是无法完成连接的
一样的道理
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-28 15:43:29 | 显示全部楼层
Post by zhllg
你的definition只是你的api的definition,你的api调用的库函数没有definition

举个例子,你写了个新的puts
<my_puts.c>
void my_puts(char *s){
puts(s);
}
</my_puts.c>
在这个文件里有你的新api - my_puts的定义,但没有puts的定义
你把它弄成了.o/.a/.so,然后给了别人
如果那个人没有libc,他是无法完成连接的
一样的道理


如果我重写了原库接口的definition, 那原库还有用吗?
回复 支持 反对

使用道具 举报

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

本版积分规则

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