LinuxSir.cn,穿越时空的Linuxsir!

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

链接与库的一个问题

[复制链接]
发表于 2005-9-24 12:53:06 | 显示全部楼层
在最后一步连接的时候一定要包含定义了list_free的.o或者.a或者.so
可不可以写出来你连接时执行的命令
还有写明那个文件定义,那个文件里使用

ps:干脆都贴上来得了,一看不就明白了
回复 支持 反对

使用道具 举报

发表于 2005-9-24 15:27:40 | 显示全部楼层
你在编译你的库时, 所用到的其它的库是动态链接的还是静态?
如果是STATIC,你的库的依赖库的相关函数会编译到你的库中啊。 那么其它人用你的库时就不需要你的库所依赖的库了。
回复 支持 反对

使用道具 举报

发表于 2005-9-24 22:40:07 | 显示全部楼层
把所有的代码打包发上来,让我大家看看不就清楚了。你这样只言片语的,我们也很难全面地了解问题。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-26 14:45:15 | 显示全部楼层
Post by kj501
把所有的代码打包发上来,让我大家看看不就清楚了。你这样只言片语的,我们也很难全面地了解问题。

我原来怕帖子太长,会让人头疼……
真是对不住大家,我痛改前非。

这是我的一个头文件:

  1. ifndef TRANSCEIVER_H
  2. #define TRANSCEIVER_H
  3. #include "sip_msg.h"

  4. #ifdef __cplusplus
  5. extern "C" {
  6. #endif

  7. int decoder(sip_msg_t* sip_msg, char* message);
  8. int sender(sip_msg_t* sip_msg);

  9. #ifdef __cplusplus
  10. }
  11. #endif

  12. #endif
复制代码

=================================
编译

  1. g++ -Wall -fPIC -Wno-deprecated -D_REENTRANT -DUSE_PTHREADS -g         -I../../build -I../../build/../sip/sipstack -I../../build/../sdp/sdp2 -I../../build/../util -I../../build/../util/threads -I../../build/../util/logging -I../../build/../util/crypto -I../../build/../util/statistics -I../../build/../util/snmp -I../../build/../util/signals -I../../build/../util/behavior -I../../build/../util/io -I../../build/../util/services -I../../build/../util/transport -I../../build/../util/config -I../../build/../util/dnssrv -I../../build/../util/deprecated -I../../build/../util/adt -DVOCAL_USE_DEPRECATED -DVOCAL_USING_PENTIUM -c -o obj.debug.Linux.i686/transceiver.o transceiver.cxx
复制代码

=================================
打包
  1. ar rv obj.debug.Linux.i686/libsipmsg.a obj.debug.Linux.i686/sip_msg.o obj.debug.Linux.i686/transceiver.o || rm obj.debug.Linux.i686/libsipmsg.a
  2. a - obj.debug.Linux.i686/sip_msg.o
  3. a - obj.debug.Linux.i686/transceiver.o
  4. ranlib obj.debug.Linux.i686/libsipmsg.a || rm obj.debug.Linux.i686/libsipmsg.a
复制代码

sip_msg.o中没有调用原库。
=================================

nm libsipmsg.a的部分输出:

  1. 00000000 T decoder
  2. 00000000 W _ZN4SptrIN5Vocal7BaseUrlEED1Ev

  3. 00001f8a r _ZN5Vocal10TRANSEQUALE

  4. 00000000 W _ZNK5Vocal7SipCSeq9getMethodEv
  5.          U _ZNK5Vocal7SipFrom14getDisplayNameEv
  6.          U _ZNK5Vocal7SipFrom6getTagEv
  7.          U _ZNK5Vocal7SipFrom7getHostEv
  8.          U _ZNK5Vocal7SipFrom7getPortEv
  9.          U _ZNK5Vocal7SipFrom7getUserEv
复制代码

这个r _ZN5Vocal10TRANSEQUALE中的r是什么意思?在man page中没有看到。
=================================
测试程序strange.c

  1. #include "sip_msg.h"
  2. #include "transceiver.h"

  3. int main()
  4. {
  5.         char message[1024];
  6.         sip_msg_t* my_sip_msg;
  7.         sip_msg_init(&my_sip_msg);
  8.         decoder(my_sip_msg, message);
  9.         sip_msg_free(my_sip_msg);
  10. }
复制代码

=================================


测试程序的Makefile:

  1. strange2 : strange.o
  2.         $(CXX) -o $@ $^ -g -static -L./obj.debug.Linux.i686 -lsipmsg
复制代码

CXX=g++,      ./obj.debug.Linux.i686是各种.o和.a的所在地

=================================
make strange2的部分输出:

  1. ./obj.debug.Linux.i686/libsipmsg.a(transceiver.o)(.text+0xe1): In function `decoder':
  2. ./obj.debug.Linux.i686/libsipmsg.a(transceiver.o)(.text+0x544):/sourceforge/vocal/fullproxy/sipmsg/transceiver.cxx:89: undefined reference to `Vocal::SipMsg::getVia(int) const'
  3. ./obj.debug.Linux.i686/libsipmsg.a(transceiver.o)(.text+0x553):/sourceforge/vocal/fullproxy/sipmsg/transceiver.cxx:89: undefined reference to `Vocal::SipVia::getBranch() const'
  4. ./obj.debug.Linux.i686/libsipmsg.a(transceiver.o)(.text+0x562):/sourceforge/vocal/fullproxy/sipmsg/transceiver.cxx:89: undefined reference to `Data::getData(char*, int) const'
复制代码

=================================


各位仁兄还需要什么分析材料尽管说。
回复 支持 反对

使用道具 举报

发表于 2005-9-26 21:14:26 | 显示全部楼层
这样做只是将API打包了。在链接时仍然需要被包装的那个库。
回复 支持 反对

使用道具 举报

发表于 2005-9-26 21:33:31 | 显示全部楼层
早就说了,如果想静态链接的时候不需要原库,原库必须是共享库
回复 支持 反对

使用道具 举报

发表于 2005-9-26 21:56:25 | 显示全部楼层
libsipmsg.a就是你说的api编译出来的?不含有函数定义,是么?
这样肯定不行的
不用想了
最后一步连接的命令里一定要包含有定义了那些函数的.o
哪怕定义的是空函数体{}
回复 支持 反对

使用道具 举报

发表于 2005-9-26 22:12:02 | 显示全部楼层
Post by rickxbx
早就说了,如果想静态链接的时候不需要原库,原库必须是共享库

关于这一点
如果你确认可行的话
不妨举个例子出来
包括简单的源文件和命令
回复 支持 反对

使用道具 举报

发表于 2005-9-26 22:50:12 | 显示全部楼层
Post by zhllg
关于这一点
如果你确认可行的话
不妨举个例子出来
包括简单的源文件和命令


  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-26 23:04:58 | 显示全部楼层
Post by rickxbx
早就说了,如果想静态链接的时候不需要原库,原库必须是共享库

那原来的是静态库就没办法了吗?到哪儿都得一起带着......
回复 支持 反对

使用道具 举报

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

本版积分规则

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