无法在Mac OS X上使用SDL 2 +OpenGL 3.3编译着色器

w80xi6nr  于 8个月前  发布在  Mac
关注(0)|答案(1)|浏览(71)

我通过brew的brew install sdl2在mac上获得了sdl 2。现在我试着编译一个简单的C程序,但我无法启动它。
我试着编译如下:

gcc -Wall -std=c99 -I/opt/homebrew/Cellar/sdl2/2.28.2/include/SDL2 -c ../src/main.c -o target/o/main.o
gcc -Wall -std=c99 -I/opt/homebrew/Cellar/sdl2/2.28.2/include/SDL2 -c ../src/glad/glad.c -o target/o/glad.o
gcc -ldl -L/opt/homebrew/Cellar/sdl2/2.28.2/lib -lSDL2 -o target/csdldemo target/o/main.o target/o/glad.o

这里/opt/homebrew/Cellar/sdl2/2.28.2/include/SDL2是指向SDL 2安装的路径。
应用程序编译没有任何问题。然而,当我通过./target/csdldemo启动它时,它立即被操作系统杀死。即:

./target/csdldemo     
zsh: killed     ./target/csdldemo

我仍然可以通过lldb ./target/csdldemo启动应用程序,然后运行它(即通过lldb提示符中的r命令),但后来当我尝试使用OpenGL 3.3函数时失败了。
我试着运行它至少使用lldb,但我认为以下不工作:

// I run the following after SDL_Init(SDL_INIT_VIDEO) but before SDL_CreateWindow:
SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 4);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 24);

还尝试将主/次版本设置为3.34.5也无济于事。
在Mac OS X上不起作用的代码是尝试编译着色器。
着色器定义:

#version 330 core
out vec4 FragColor;
void main() {
    FragColor = vec4(1.0, 0.5, 0.2, 1.0);
}

编译上述代码的代码:

CHECK(fragmentShader = glCreateShader(GL_FRAGMENT_SHADER));
CHECK(glShaderSource(fragmentShader, 1, &fragmentShaderSource, NULL));
CHECK(glCompileShader(fragmentShader));

这里:CHECK是一个简单的宏,它在执行OpenGL API调用后检查OpenGL错误,并且在执行glCompileShader后显示错误version '330' is not supported

ERROR: 0:1: '' :  version '330' is not supported
ERROR: 0:1: '' : syntax error: #version

在上面的代码片段中,我使用了glad中的glCompileShader,它的生成方式如下:

OpenGL loader generated by glad 0.1.34 on Thu Aug 24 17:59:33 2023.

    Language/Generator: C/C++
    Specification: gl
    APIs: gl=3.0
    Profile: compatibility
    Extensions:
        
    Loader: True
    Local files: True
    Omit khrplatform: False
    Reproducible: False

    Commandline:
        --profile="compatibility" --api="gl=3.0" --generator="c" --spec="gl" --local-files --extensions=""

Mac OS X版本为13.4(Ventura)。
完全相同的程序在Linux上编译和工作正常。
我怀疑以上是两个问题的结合:
1.无法在Mac上运行编译后的二进制文件,这可以通过立即终止程序来证明。不像其他人,这种尝试不会显示在安全设置中,所以我不知道如何使Mac OS允许执行我自己编译的二进制文件。大概brew本身没有这个问题,因为我可以使用通过brew安装的二进制文件。
1.各种消息来源指出,我的Mac版本应该支持OpenGL 4.1,我只能推测,安全子系统以某种方式干扰着色器编译?
尝试:
1.在Linux上编译和运行相同的程序。尝试在Mac和Linux上使用cmake,以及在Mac OS上使用自定义Makefile。在Linux上一切都按预期工作,在所有情况下,我看到二进制立即在Mac上被杀死。就像我说的,我仍然可以通过lldb运行程序。
1.已尝试通过相应的SDL_GL_SetAttribute设置其他版本的OpenGL。已尝试:3.3、4.1和4.5。
我想知道在我的设置中缺少了什么,是什么让glabierShader失败。任何进一步诊断/解决问题的步骤都将受到欢迎。

tquggr8v

tquggr8v1#

对于那些遇到同样问题的人:在设置所有其他属性之前,缺少的部分是SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE)
感谢用户Ripi 2的建议。
至于zsh杀死进程-或者更准确地说,OS向进程发送SIGKILL-这是由于缺少代码签名。此问题可以通过查看Mac OS X控制台应用程序中提供的崩溃报告来诊断。

相关问题