免费注册 查看新帖 |

Chinaunix

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

main函数return 0时出现段错误!求高手解答! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-12-25 11:57 |只看该作者 |倒序浏览
小弟新近接触Linux开发,出现一个在main() return 0时的段异常...求高手解答

程序很简单:
1.用C++写了一个myLib.cpp.
        里边实现了一个函数void printHello().这个函数其实就是打印了一行hello world.
2.编译myLib.cpp.
        g++ myLib.cpp -c;
3.把myLib.o编译成动态库,使用静态链接.
        g++ myLib.o -shared -static -o myLib.so;
4.用C写了一个helo.c.
        main函数里:
        用dlopen()打开myLib.so.
        用dlsym()取printHello()的入口.
        调用printHello.
        用dlclose关闭myLib.so.
        打印关闭信息.
        return 0;

hello world正常打印了.
在关闭信息之后出现一个断错误.

如果第3步这样编译就不会出现段错误: g++ myLib.o -shared -o myLib.so

编译动态库的时候用静态链接跟用动态链接有什么不一样?为什么会这样?
我的环境是rhel4.7,gcc 版本3.4.6.

[ 本帖最后由 MiniLolycon 于 2009-12-25 12:54 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-12-25 11:59 |只看该作者
按规矩贴下source code...

  1. /* hello.c */
  2. #include <dlfcn.h>
  3. #include <unistd.h>
  4. #include <error.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>

  7. int main()
  8. {
  9.     void (*fPtr) ();
  10.     void *dPtr;
  11.     if ((dPtr = dlopen("./myLib.so", RTLD_LAZY)) == NULL)
  12.       {
  13.           printf("Open failed!\n");
  14.           exit(0);
  15.       }
  16.     if (dPtr == NULL)
  17.       {
  18.           printf("so is NULL!\n");
  19.           exit(0);
  20.       }
  21.     fPtr = (void (*)()) dlsym(dPtr, "printHello");
  22.     if (fPtr == NULL)
  23.       {
  24.           printf("func is NULL!\n");
  25.           exit(0);
  26.       }
  27.     (*fPtr) ();
  28.     dlclose(dPtr);
  29.     printf("lib closed!\n");
  30.     return 0;
  31. }
复制代码

[ 本帖最后由 MiniLolycon 于 2009-12-28 16:53 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-12-25 12:00 |只看该作者

  1. /* myLib.cpp */

  2. #include "myLib.h"

  3. #include <iostream>

  4. using namespace std;

  5. void printHello()
  6. {
  7.     cout<<"hello world \nLinux C++"<<endl;
  8.     return;
  9. }
复制代码


  1. /* myLib.h */

  2. #ifndef myLib
  3. #define myLib

  4. extern "C" void printHello();

  5. #endif
复制代码

[ 本帖最后由 MiniLolycon 于 2009-12-28 16:54 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2009-12-25 16:45 |只看该作者
是不是share和static不能同时使用

论坛徽章:
0
5 [报告]
发表于 2009-12-28 09:31 |只看该作者
为什么不能一起用?
如果我想写一个动态库并且在编译的时候用静态链接,那么该怎么设gcc/g++的参数?

论坛徽章:
0
6 [报告]
发表于 2009-12-28 10:53 |只看该作者
3.把myLib.o编译成动态库,使用静态链接.
        g++ myLib.o -shared -static -o myLib.so;
这里就不对了...   你可以加上-Wall看看
直接g++ myLib.o -shared -o myLib.so


如果你这个so的生成需要其他的静态链接库
g++ myLib.o -shared -o myLib.so -static  -l...

论坛徽章:
0
7 [报告]
发表于 2009-12-28 10:59 |只看该作者

论坛徽章:
0
8 [报告]
发表于 2009-12-28 11:01 |只看该作者
-Wall没提示啊...
请指点一下原来写的有什么问题...
另外SEGFAULT依旧

论坛徽章:
0
9 [报告]
发表于 2011-04-04 10:58 |只看该作者
我也遇到了和LZ一样的问题。
  不同的是我的是linux下的c语言。
  问题结果都是一样的。
  编译一切正常,结果业正确,就是在主函数main 里面最后return返回之前出现一个段错误提示!
  希望能遇到哪位高手提示一下主要错在哪里啊!
期待!!!!!!!!!!!!!!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP