C++ 定义共享故障(CMake)
在设置一个新项目时(使用CMake,编译器是gcc版本5.2.1,ubuntu(15.10)),我想使用一个共享的ptr 这个简单的main.cpp工作正常: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。这里有
#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