我试图在我的 Ubuntu 18.04 系统上编译https://github.com/fogleman/HelloGL中的简约 C opengl 代码,但出现以下错误:
\ngcc -c -o build/matrix.o -std=c99 -O3 src/matrix.c \ngcc -o main build/shader.o build/main.o build/util.o build/matrix.o -lglew -lglfw3 -framework Cocoa \n-framework OpenGL -framework IOKit -framework CoreVideo -lm \ngcc: error: Cocoa: No such file or directory \ngcc: error: OpenGL: No such file or directory \ngcc: error: IOKit: No such file or directory \ngcc: error: CoreVideo: No such file or directory \ngcc: error: unrecognized command line option \xe2\x80\x98-framework\xe2\x80\x99 \ngcc: error: unrecognized command line option \xe2\x80\x98-framework\xe2\x80\x99 \ngcc: error: unrecognized command line option \xe2\x80\x98-framework\xe2\x80\x99 \ngcc: error: unrecognized command line option \xe2\x80\x98-framework\xe2\x80\x99 \nMakefile:24: recipe for target \'main\' failed\nRun Code Online (Sandbox Code Playgroud)\n我确实意识到这样做的原因是 MakeFIle 中的以下行,它是为 OSX 制作的(大概):
\nLIBS = -lglew -lglfw3 -framework Cocoa -framework OpenGL -framework IOKit -framework CoreVideo\nRun Code Online (Sandbox Code Playgroud)\n有没有办法修改这条线,使其在GNU/Linux系统上工作?\n或者它是否需要链接到 Cocoa 框架?
\n我下载了这个示例项目并自己修改了它。它似乎不包含任何特定于 OSX 的代码;只是它的 Makefile 是专门为 OSX 编写的。
首先确保您拥有libglfw3-dev和libglew-dev packages installed. Installing these from the Ubuntu package manager should automatically pull in all the other libraries that are required.
接下来,将LIBSMakefile 的行更改为读取
LIBS = -lGLEW -lglfw -lGL -lm
Run Code Online (Sandbox Code Playgroud)
没有明显的原因,libglew在 OSX 上调用的库在(Debian 风格)Linux 上调用libGLEW,在 OSX 上调用的库在 Linux 上libglfw3调用libglfw。 -lGL在 Linux 中相当于-framework OpenGL, 并-lm引入了数学库(一次调用需要sqrt), which is separate from the core C library on Linux but not on OSX, if I remember correctly.
您可能还需要调整 FLAGS 行。这个设置对我有用:
FLAGS = -g -O2 -std=gnu99 -Wall -Wextra -Wpedantic
Run Code Online (Sandbox Code Playgroud)
这里重要的变化是-std=gnu99代替-std=c99. 比较严格的c99模式比较麻烦;它禁用人们没有意识到的扩展,例如定义该程序想要的math.h常量。M_PI(它还有一个坏习惯,会破坏与网络相关的系统标头,原因太复杂,无法在这里详细介绍。幸运的是,这个程序不使用网络。)
我也加了-Wall -Wextra -Wpedantic,加了-g,改成-O3了-O2。这些都是我对我修改的每个 C 程序习惯做的事情。前两个可以揭示问题,而且几乎不会造成伤害;在这种情况下,它们没有产生任何明显的差异。第三个是因为-O3经常会使您的程序比本来的速度慢-O2。