使用 shared_ptr 和 glutInit 会导致分段错误
Posted
技术标签:
【中文标题】使用 shared_ptr 和 glutInit 会导致分段错误【英文标题】:Using shared_ptr and glutInit causes segmentation fault 【发布时间】:2015-11-22 17:00:18 【问题描述】:在我尝试了很多东西之前询问了this,发现问题与glutInit有关。采取以下代码示例: main.cpp
#include <iostream>
#include <memory>
#include<GL/glut.h>
using namespace std;
int main(int argcp, char **argv)
shared_ptr<double> abc;
glutInit(&argcp,argv);
cout<<"Hello!"<<endl;
return 0;
编译:
g++ -std=c++11 -g -Wall -o appx main.cpp -lGL -lGLU -lglut
使用 g++ 5.2.1、ubuntu 15.10 导致可执行文件立即崩溃(没有“Hello!”输出)并出现段错误
只是注释掉一行
shared_ptr<double> abc;
将修复崩溃。
由于我想在项目中使用 shared_ptr 和 glut,我想知道如何解决此问题或导致崩溃的原因。
编辑 1: GDB 跟踪:
#0 0x0000000000000000 in ?? ()
#1 0x00007ffff33fb6fd in init () at dlerror.c:177
#2 _dlerror_run (operate=operate@entry=0x7ffff33fb0e0 <dlsym_doit>,args=args@entry=0x7fffffffde00) at dlerror.c:129
#3 0x00007ffff33fb148 in __dlsym (handle=<optimized out>, name=optimized out>) at dlsym.c:70
#4 0x00007ffff6fa2e1e in ?? () from /usr/lib/nvidia-352/libGL.so.1
#5 0x00007ffff6f4db47 in ?? () from /usr/lib/nvidia-352/libGL.so.1
#6 0x00007ffff7de957d in call_init (l=0x7ffff7fc59c8,argc=argc@entry=1, argv=argv@entry=0x7fffffffdf58, env=env@entry=0x7fffffffdf68)at dl-init.c:58
#7 0x00007ffff7de96cb in call_init (env=<optimized out>, argv=<optimized out>, argc=<optimized out>, l=<optimized out>) at dl-init.c:30
#8 _dl_init (main_map=0x7ffff7ffe188, argc=1, argv=0x7fffffffdf58, env=0x7fffffffdf68) at dl-init.c:120
#9 0x00007ffff7dd9d0a in _dl_start_user () from /lib64/ld-linux-x86-64.so.2
#10 0x0000000000000001 in ?? ()
#11 0x00007fffffffe2c8 in ?? ()
#12 0x0000000000000000 in ?? ()
【问题讨论】:
this 看起来相关.. 请在 gdb 中运行并给我们回溯。 无法使用 gcc 5.1.1 在 Fedora 22 上重现。 我添加了 gdb 输出,但在这里似乎没有多大帮助。 如果您使用-pthread
标志编译/链接,您会遇到同样的问题吗?
【参考方案1】:
在 cmets 中发布的问题与 here 发布的问题类似。
解决办法是添加:
-lpthread
到编译器标志! 非常感谢!
【讨论】:
以上是关于使用 shared_ptr 和 glutInit 会导致分段错误的主要内容,如果未能解决你的问题,请参考以下文章
无法解析的外部符号 __imp____glutInitWithExit@12,该符号在函数 _glutInit_ATEXIT_HACK@8 中被引用
使用相同的函数但重载不同的 std::tr1::shared_ptr<T> 和 std::shared_ptr<T>
“预定义”和使用命名空间和 std::shared_ptr 的正确方法是啥?