在设置一个新项目时(使用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的情况下重现段错误。
答案 0 :(得分:0)
经过更多的代码挖掘后,我发现问题与CMake无关。对an other question的评论是解决方案!
原来你必须链接到 pthread
-lpthread
或只是
target_link_libraries(test ... pthread )
这样共享指针就可以解决这个问题。我仍然觉得很奇怪链接器没有检测到它!