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

问题描述 投票:0回答:1

我通过brew's

brew install sdl2
在Mac上获得了SDL2。现在我尝试编译一个简单的 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
是SDL2的安装路径。

应用程序编译没有任何问题。然而,当我通过

./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.3
4.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错误,并且在执行
version '330' is not supported
后显示错误说明
glCompileShader

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

在上面的代码片段中,我使用了

glCompileShader
中的
glad
,其生成如下:

 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
    安装的二进制文件。
  2. 各种消息来源表明我的 Mac 版本应该支持 OpenGL 4.1,我只能推测安全子系统以某种方式干扰着色器编译?

尝试过:

  1. 在 Linux 上编译并运行相同的程序。尝试在 Mac 和 Linux 上使用 cmake,以及在 Mac OS 上使用自定义 Makefile。在 Linux 上一切都按预期工作,在所有情况下我都看到二进制文件在 Mac 上立即被杀死。就像我说的,我仍然可以通过
    lldb
    运行程序。
  2. 尝试通过相应的
    SDL_GL_SetAttribute
    设置其他版本的OpenGL。尝试过:3.3、4.1 和 4.5。

我想知道我的设置中缺少什么导致 glCompilerShader 失败。任何进一步诊断/解决问题的步骤将不胜感激。

c macos opengl sdl-2 macos-ventura
1个回答
0
投票

对于遇到同样问题的人:在设置所有其他属性之前,缺少的部分是

SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE)

感谢用户 Ripi2 的建议。

至于 zsh 杀死进程 - 或者更准确地说,操作系统向进程发送 SIGKILL - 这是由于缺乏代码签名。可以通过查看 Mac OS X 控制台应用程序中提供的崩溃报告来诊断此问题。

© www.soinside.com 2019 - 2024. All rights reserved.