定义shared_ptr会导致segfault(CMake)

时间:2015-11-22 14:01:32

标签: c++ c++11 cmake segmentation-fault shared-ptr

在设置一个新项目时(使用CMake,编译器是gcc版本5.2.1,ubuntu(15.10)),我想使用shared_ptr。

这个简单的main.cpp工作正常:

#include <iostream>
#include <memory>    
using namespace std;

int main()
{    
    cout<<"Hi there!"<<endl;
    return 0;
}

但是只是定义一个shared_ptr会导致程序在写入&#34之前使用segfault崩溃;你好!&#34;。

#include <iostream>
#include <memory>    
using namespace std;

int main()
{    
    cout<<"Hi there!"<<endl;
    shared_ptr<double> test;  // <- new line
    return 0;
}

我添加了

set(CMAKE_CXX_FLAGS "-std=c++11")

到CMakeLists.txt。我有什么东西在这里失踪。由于shared_ptr的定义,我找不到解释segfault的任何答案。

GDB输出完全没有帮助:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()

修改 使用

手动编译
g++ -std=c++11 -o testx main.cpp

为两种情况生成可运行的可执行文件,因此我猜它必须是一个CMake问题。所以这是该项目的CMake文件:

project(yorld3)
cmake_minimum_required(VERSION 2.8)

set(CMAKE_CXX_FLAGS "-std=c++11")

find_package(OpenGL REQUIRED)
include_directories(${OpenGL_INCLUDE_DIRS})
set(LIBS ${LIBS} ${OpenGL_LIBRARIES})

find_package(GLUT REQUIRED)
include_directories(${GLUT_INCLUDE_DIRS})
set(LIBS ${LIBS} ${GLUT_LIBRARIES})

find_package(Bullet REQUIRED)
include_directories(${Bullet_INCLUDE_DIRS})
set(LIBS ${LIBS} ${Bullet_LIBRARIES})

link_directories(${SRC_BINARY_DIR}/src)

add_subdirectory(src)
INCLUDE_DIRECTORIES(src)
INCLUDE_DIRECTORIES(src/core)
add_executable(test main.cpp )
target_link_libraries(test mycorelib GLU GL glut)

EDIT2: 经过大量测试后,我再次手动编译程序而不是链接我的lib:

g++ -std=c++11 -g -Wall -I src/core/app -o testx main.cpp src/core/app/yorld_window.cpp -lGL -lGLU -lglut

这样我就可以在不使用CMake的情况下重现段错误。

1 个答案:

答案 0 :(得分:0)

经过更多的代码挖掘后,我发现问题与CMake无关。对an other question的评论是解决方案!

原来你必须链接到 pthread

  

-lpthread

或只是

  

target_link_libraries(test ... pthread

这样共享指针就可以解决这个问题。我仍然觉得很奇怪链接器没有检测到它!