C++ 定义共享故障(CMake)

C++ 定义共享故障(CMake),c++,c++11,cmake,segmentation-fault,shared-ptr,C++,C++11,Cmake,Segmentation Fault,Shared Ptr,在设置一个新项目时(使用CMake,编译器是gcc版本5.2.1,ubuntu(15.10)),我想使用一个共享的ptr 这个简单的main.cpp工作正常: #include <iostream> #include <memory> using namespace std; int main() { cout<<"Hi there!"<<endl; return 0; } 到CMakeLists.txt。这里有

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

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

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

int main()
{    
    cout<<"Hi there!"<<endl;
    return 0;
}
到CMakeLists.txt。这里有我遗漏的东西吗。由于共享ptr的定义,我找不到任何解释SEGFULT的答案

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: 经过大量测试后,我再次手动编译程序,不链接我的库:

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

通过这种方式,我可以在不使用CMake的情况下复制segfault。

在进一步挖掘代码后,我发现问题与CMake无关。对的评论是解决方案

事实证明,您必须链接到pthread

-lpthread

或者只是

目标链接库(测试…pthread


这样,共享指针就可以与glut一起工作。我仍然觉得奇怪,链接器根本没有检测到这一点

在生成的二进制文件中,在编译器中还是在cmake中?编译器及其版本是什么?你在用什么操作系统?根据您提供的信息很难找到问题。手动编译此代码在g++4.9.2和clang++3.8.0中有效,在MSVC++14.0和GCC 5.2So中也有效,可能是某种全局构造函数?全局上下文中构造函数的顺序在翻译单元之间是未指定的,因此可能是问题的一部分。
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)
g++ -std=c++11 -g -Wall -I src/core/app -o testx main.cpp src/core/app/yorld_window.cpp -lGL -lGLU -lglut