免费注册 查看新帖 |

Chinaunix

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

g++ 的动态库问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-03-09 19:00 |只看该作者 |倒序浏览
程序1 s.cpp

  1. int soTest(int a,int b)
  2. {
  3.         return a+b;
  4. }
复制代码


编译:
g++  -c s.cpp
g++ -shared -o s.so s.o


程序2 t.cpp

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

  4. int main(int argc, char **argv)
  5. {
  6.         void *handle;
  7.         int (*soTest)(int,int);
  8.         char *error;

  9.         handle = dlopen ("./s.so", RTLD_LAZY);
  10.         if (!handle)
  11.         {
  12.                 fprintf (stderr, "%s\n", dlerror());
  13.                 exit(1);
  14.         }

  15.         (void *)soTest = (int (*)(int,int))dlsym(handle, "soTest");
  16.         if ((error = dlerror()) != NULL)
  17.         {
  18.                 fprintf (stderr, "%s\n", error);
  19.                 exit(1);
  20.         }

  21.         printf ("%d\n", (*soTest)(2,3));
  22.         dlclose(handle);

  23.         return 0;
  24. }
复制代码

编译:
g++ -c t.cpp
g++ -o t t.o -ldl


但运行时提示 undefined symbol: soTest

一样的程序使用 gcc 编译可以运行,但 g++ 却不行。
不知 unix 下 c++ 的程序该如何使用动态库呢?

我希望把一个程序设计成模块化,允许使用动态库动态载入扩充功能,这样只需按一定的规范做成动态库即可无需重新编译和重新启动主程序即可实现扩展与停止模块。

因为系统使用 c++ 开发,所以必须使用 g++ 编译动态库,遇到点麻烦,有兴趣的朋友请指点一下。

论坛徽章:
0
2 [报告]
发表于 2003-03-10 12:36 |只看该作者

g++ 的动态库问题

你编译库时G++选项也有问题
应该使用-fPIC
可以看看C++论坛FAQ

论坛徽章:
0
3 [报告]
发表于 2003-03-10 22:32 |只看该作者

g++ 的动态库问题

-fPIC 是产生与位置无关的代码阿,我不想让它与位置无关。所以不加。

如果按照一般的做法加上那些:


  1. g++ -c s.cpp
  2. g++ -fPIC -shared -o s.so s.o

  3. g++ -c t.cpp
  4. g++ -rdynamic -s -o t t.o -ldl
复制代码


这样编译也还是一样的问题。

论坛徽章:
0
4 [报告]
发表于 2003-03-11 12:40 |只看该作者

g++ 的动态库问题

库代码都是位置无关的

精华区的
C++论坛FAQ中有说明

自己看看

论坛徽章:
0
5 [报告]
发表于 2003-03-12 21:57 |只看该作者

g++ 的动态库问题

我的问题不是  -fPIC 赫赫。
问题是 c++ 不能用动态库阿。难道都没有人知道?
没有人使用过这种结构设计程序?
我想 g++ 不可能不支持吧? 但问题是要怎么样才能让它执行呢?
如果不能用这个,系统的灵活性、扩展能力都会大大的降低,也不便于模块化的管理。

论坛徽章:
0
6 [报告]
发表于 2003-03-16 02:27 |只看该作者

g++ 的动态库问题

都没人知道?

论坛徽章:
0
7 [报告]
发表于 2003-03-16 14:45 |只看该作者

g++ 的动态库问题

终于研究成功了。只要在 s.cpp 中加入 extern "C" 的声明就可以被 c++ 使用了。


  1. extern "C"
  2. {
  3.         int soTest(int a,int b) ;
  4. }

  5. int soTest(int a,int b)
  6. {
  7.    return a+b;
  8. }
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP