我通过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 上编译并运行良好。
我怀疑以上是两个问题的结合:
brew
本身没有这个问题,因为我可以使用通过 brew
安装的二进制文件。尝试过:
lldb
运行程序。SDL_GL_SetAttribute
设置其他版本的OpenGL。尝试过:3.3、4.1 和 4.5。我想知道我的设置中缺少什么导致 glCompilerShader 失败。任何进一步诊断/解决问题的步骤将不胜感激。
对于遇到同样问题的人:在设置所有其他属性之前,缺少的部分是
SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE)
。
感谢用户 Ripi2 的建议。
至于 zsh 杀死进程 - 或者更准确地说,操作系统向进程发送 SIGKILL - 这是由于缺乏代码签名。可以通过查看 Mac OS X 控制台应用程序中提供的崩溃报告来诊断此问题。