SDL2程序与Mac OS X上的jemalloc崩溃相关联,但不是ubuntu

时间:2016-05-25 17:08:00

标签: c++ macos opengl sdl-2 folly

我跟着this tutorial并使用SDL2设置了一个非常简单的opengl程序。为了这个问题,我删除了部分内容。程序打开一个窗口,将背景颜色设置为红色,然后循环直到按下退出键。

#include <unistd.h>
#include <string>
#include <iostream>

#include <OpenGL/gl.h>
#include <SDL2/SDL.h>

using namespace std;

void CheckSDLError(int line = -1) {
  std::string error = SDL_GetError();

  if (error != "") {
    std::cout << "SLD Error : " << error << std::endl;

    if (line != -1) {
      std::cout << "\nLine : " << line << std::endl;
    }
    SDL_ClearError();
  }
}


bool SetOpenGLAttributes() {
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE);
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3);
  SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2);
  SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);

  return true;
}

SDL_Window *mainWindow;
SDL_GLContext mainContext;

bool sdlInit() {
  // Initialize SDL's Video subsystem                                            
  if (SDL_Init(SDL_INIT_VIDEO) < 0) {
    std::cout << "Failed to init SDL\n";
    return false;
  }

  mainWindow = SDL_CreateWindow("SDL2 window, son", SDL_WINDOWPOS_CENTERED,
                                SDL_WINDOWPOS_CENTERED,
                                640, 640, SDL_WINDOW_OPENGL);

  if (!mainWindow) {
    std::cout << "Unable to create window\n";
    CheckSDLError(__LINE__);
    return false;
  }
  // Create our opengl context and attach it to our window                       
  mainContext = SDL_GL_CreateContext(mainWindow);
  SetOpenGLAttributes();

  // This makes our buffer swap syncronized with the monitor's vertical refresh  
  SDL_GL_SetSwapInterval(1);

  return true;
}

void mainLoop() {
  while (true) {
    usleep(40000);//40 ms = 40000 us                                             
    SDL_Event event;
    while (SDL_PollEvent(&event)) {
      cout << "here\n";
      glClearColor(1.0, 0.0, 0.0, 1.0);
      glClear(GL_COLOR_BUFFER_BIT);
      SDL_GL_SwapWindow(mainWindow);
      if (event.type == SDL_QUIT) {
        return;
      }
      if (event.type == SDL_KEYDOWN) {
        switch (event.key.keysym.sym) {
        case SDLK_ESCAPE:
          return;
          break;
        }
      }
    }
  }
}


int main(int argc, char** argv) {
  if (!sdlInit()) {
    return -1;
  }
  mainLoop();
  SDL_GL_DeleteContext(mainContext);
  SDL_DestroyWindow(mainWindow);
  SDL_Quit();
  return 0;
}

程序编译,链接和工作,因为当我用我的mac上的clang编译

时我会期待
g++ -g -std=c++0x -Wall main.cpp -o prog -framework opengl -framework SDL2

但是,如果我尝试链接Facebook's Folly,请执行以下操作:

g++ -g -std=c++0x -Wall main.cpp -o prog -framework opengl -framework SDL2 -lfolly

程序仍然编译并成功链接。但是,当我运行程序时,它会在几秒钟后每次都崩溃。 lldb显示以下内容:

Process 36200 stopped
* thread #4: tid = 0xf254f, 0x00007fff9c6891f4 libsystem_platform.dylib`OSSpinLockLock + 7, stop reason = EXC_BAD_ACCESS (code=1, address=0x390)
    frame #0: 0x00007fff9c6891f4 libsystem_platform.dylib`OSSpinLockLock + 7
libsystem_platform.dylib`OSSpinLockLock:
->  0x7fff9c6891f4 <+7>:  lock   
    0x7fff9c6891f5 <+8>:  cmpxchgl %ecx, (%rdi)
    0x7fff9c6891f8 <+11>: je     0x7fff9c6891ff            ; <+18>
    0x7fff9c6891fa <+13>: jmp    0x7fff9c689d6e            ; _OSSpinLockLockSlow

我的模糊理解是SDL2是动态链接的,在阅读this answer之后,我认为当我与愚蠢的联系时,我使用的是某些库的不同实现,而不是我没有与愚蠢的联系。我也不确定它是否相关,但我能够编译上面的代码并链接到我的Ubuntu桌面上的愚蠢,并且生成的二进制文件可以毫无问题地运行。为了在Mac 10.11.5上一起使用SDL2和愚蠢,我需要做什么?

1 个答案:

答案 0 :(得分:1)

偶尔会有SDL2撰稿人:

我运行时没有看到崩溃,尽管与Folly链接,以及使用OSX 10.11.5时。

一些观察结果:

  1. 'brew install SDL2'命令未安装SDL2框架。它看起来将静态库libSDL2.a和动态库libSDL2.dylib安装到/ usr / local中,但没有安装.framework。您是否可以使用来自不同(非酿造)安装的SDL2.framework?

  2. 为了构建,我必须在-I / usr / local / include和-L / usr / local / lib中加入g ++调用。是否可以从其他地方检索标题和/或库(例如单独的SDL2框架)?

  3. 我的系统上的'g ++'副本实际上是clang,它是由Xcode v7.3.1提供的,我认为Apple刚刚链接到/ usr / bin / g ++。您使用的是g ++的实际版本吗?如果使用的话,是什么版本以及来自哪个来源?

  4. 这些都不是说它们导致错误,我主要是想看看我的开发环境和你的开发环境有什么不同。 : - )