无法识别的命令行选项“-framework”

Pin*_*ido 2 c opengl

我试图在我的 Ubuntu 18.04 系统上编译https://github.com/fogleman/HelloGL中的简约 C opengl 代码,但出现以下错误:

\n
gcc -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\n
Run Code Online (Sandbox Code Playgroud)\n

我确实意识到这样做的原因是 MakeFIle 中的以下行,它是为 OSX 制作的(大概):

\n
LIBS = -lglew -lglfw3 -framework Cocoa -framework OpenGL -framework IOKit -framework CoreVideo\n
Run Code Online (Sandbox Code Playgroud)\n

有没有办法修改这条线,使其在GNU/Linux系统上工作?\n或者它是否需要链接到 Cocoa 框架?

\n

zwo*_*wol 5

我下载了这个示例项目并自己修改了它。它似乎不包含任何特定于 OSX 的代码;只是它的 Makefile 是专门为 OSX 编写的。

首先确保您拥有libglfw3-devlibglew-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