免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 10703 | 回复: 7
打印 上一主题 下一主题

[故障求助] AIX xlC 动态链接库+静态库的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-04-14 17:56 |只看该作者 |倒序浏览
各位大侠

    小弟在AIX上遇到一个问题。

    形象描述如下

    a.c是主函数,其打开动态库libb.so ,并执行动态库中的bfunc

      b.c是动态库的源代码,其中bfunc函数调用了外部的afunc函数

    c.c是afunc的实现部分,其生成在另外一个静态库中。

    现在bfunc无法找到afucn,不知如何才能解决

    希望大侠在环境下编译,贴一段如何编译动态库的说明解决不了问题。。。

    代码如下
    a.c


  1. #include <stdlib.h>;
  2. #include <stdio.h>;
  3. #include <dlfcn.h>;
  4. main()
  5. {
  6.         void            * dlhandle=NULL;
  7.         int             (*pfunc)();
  8.         dlhandle = dlopen( "libb.so", RTLD_LAZY );
  9.         if( dlhandle == NULL ) {
  10.                 fprintf( stderr, "dlopen error(%s)\n", dlerror() );
  11.                 exit( -1 );
  12.         }
  13.         fprintf( stdout, "dlhandle succ\n" );
  14.         pfunc = dlsym( dlhandle, "bfunc" );
  15.         if( pfunc == NULL ) {
  16.                 fprintf( stderr, "dlsym error(%s)\n", dlerror() );
  17.                 exit( -1 );
  18.         }
  19.         pfunc();
  20.         dlclose( dlhandle );
  21.         exit( 0 );
  22. }
复制代码


b.c

  1. include <stdlib.h>;
  2. #include <stdio.h>;
  3. #include <dlfcn.h>;

  4. extern int      afunc();

  5. int
  6. bfunc()
  7. {
  8.         fprintf( stdout, "in bfunc\n" );
  9.         fprintf( stdout, "afunc=%d\n", afunc() );
  10.         return 0;
  11. }

复制代码


c.c

  1. #include <stdlib.h>;
  2. #include <stdio.h>;


  3. int
  4. afunc()
  5. {
  6. #if( defined __hp__ || defined HPUX )
  7.         return 100;
  8. #else
  9.         return 101;
  10. #endif
  11. }

复制代码


编译动态库时候的参数用了
cc -G -brtl -berok -bnoentry -bexpall -o libb.so  b.o

总之执行调用静态库中的函数就出错。。。

谢谢了


${OBJSB}b\

论坛徽章:
0
2 [报告]
发表于 2005-04-15 10:14 |只看该作者

AIX xlC 动态链接库+静态库的问题

啊,没有高手么?

不会吧。。我不信。。。

论坛徽章:
0
3 [报告]
发表于 2005-05-13 09:35 |只看该作者

AIX xlC 动态链接库+静态库的问题

把你的makefile和.exp文件内容贴出啊
是不是.exp中静态库的函数没有标示出来啊
我一般做的时候 静态库的函数是不链接到动态库中的
而是在编译执行文件是 直接和动态库一起被主调函数一起编译

论坛徽章:
0
4 [报告]
发表于 2005-06-14 13:19 |只看该作者

AIX xlC 动态链接库+静态库的问题

编译
cc -G -brtl -berok -bnoentry -bexpall -o libb.so b.c  c.c
测试可以

论坛徽章:
0
5 [报告]
发表于 2005-06-14 13:21 |只看该作者

AIX xlC 动态链接库+静态库的问题

编译
cc -G -brtl -berok -bnoentry -bexpall -o libb.so b.c  c.c
测试可以

论坛徽章:
0
6 [报告]
发表于 2005-06-16 14:52 |只看该作者

AIX xlC 动态链接库+静态库的问题

c.c文件

#include <stdio.h>;

int
afunc()
{
#if( defined __hp__ || defined HPUX )
       return 100;
#else
       return 101;
#endif
}


b.c
#include <stdio.h>;
#include <dlfcn.h>;

extern int      afunc();

int
bfunc()
{
       fprintf( stdout, "in bfunc\n" );
       fprintf( stdout, "afunc=%d\n", afunc() );
       return 0;
}


a.c
#include <stdlib.h>;
#include <stdio.h>;
#include <dlfcn.h>;

typedef int (*func_portal)();  /*func_portal的定义同SO中的函数类型有关*/

main()
{
       void  *dlhandle;
       void  *pfunc;
       func_portal MainFunc;
       int rc;
       dlhandle = dlopen( "./libb.so", RTLD_LAZY );
       if( dlhandle == NULL ) {
               fprintf( stderr, "dlopen error(%s)\n", dlerror() );
               exit( -1 );
       }
       fprintf( stdout, "dlhandle succ\n" );
       pfunc = dlsym( dlhandle, "bfunc" );
       if( pfunc == NULL ) {
               fprintf( stderr, "dlsym error(%s)\n", dlerror() );
               exit( -1 );
       }
       }
      MainFunc=(func_portal)pfunc;
      rc=MainFunc();
      printf("%d\n",rc);
      dlclose( dlhandle );
       exit( 0 );
}
      
      
编译过程

第一步:生成"点O文件"  
   命令:  cc -c b.c c.c
第二步:生成"点SO文件"  
   命令: ld -G -lc -bnoentry -bexpall b.o c.o -o libb.so
第三步: 生成调用SO的文件
   命令: cc a.c -o a.out
   
运行环境:AIX4.3.3+c for aix

论坛徽章:
0
7 [报告]
发表于 2005-06-16 15:02 |只看该作者

AIX xlC 动态链接库+静态库的问题

c.c文件

#include <stdio.h>;

int
afunc()
{
#if( defined __hp__ || defined HPUX )
       return 100;
#else
       return 101;
#endif
}


b.c
#include <stdio.h>;
#include <dlfcn.h>;

extern int      afunc();

int
bfunc()
{
       fprintf( stdout, "in bfunc\n" );
       fprintf( stdout, "afunc=%d\n", afunc() );
       return 0;
}


a.c
#include <stdlib.h>;
#include <stdio.h>;
#include <dlfcn.h>;

typedef int (*func_portal)();  /*func_portal的定义同SO中的函数类型有关*/

main()
{
       void  *dlhandle;
       void  *pfunc;
       func_portal MainFunc;
       int rc;
       dlhandle = dlopen( "./libb.so", RTLD_LAZY );
       if( dlhandle == NULL ) {
               fprintf( stderr, "dlopen error(%s)\n", dlerror() );
               exit( -1 );
       }
       fprintf( stdout, "dlhandle succ\n" );
       pfunc = dlsym( dlhandle, "bfunc" );
       if( pfunc == NULL ) {
               fprintf( stderr, "dlsym error(%s)\n", dlerror() );
               exit( -1 );
       }
       }
      MainFunc=(func_portal)pfunc;
      rc=MainFunc();
      printf("%d\n",rc);
      dlclose( dlhandle );
       exit( 0 );
}
      
      
编译过程

第一步:生成"点O文件"  
   命令:  cc -c b.c c.c
第二步:生成"点SO文件"  
   命令: ld -G -lc -bnoentry -bexpall b.o c.o -o libb.so
第三步: 生成调用SO的文件
   命令: cc a.c -o a.out
   
运行环境:AIX4.3.3+c for aix

论坛徽章:
0
8 [报告]
发表于 2005-06-16 15:08 |只看该作者

AIX xlC 动态链接库+静态库的问题

特别说明,最前面兄弟,你A.C程序中有错误
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP