使用 g++ 编译使用 fltk 和 OpenGL 的文件在 MacO 上会出错

Posted

技术标签:

【中文标题】使用 g++ 编译使用 fltk 和 OpenGL 的文件在 MacO 上会出错【英文标题】:Compiling a file which uses fltk and OpenGL with g++ gives error on MacOs 【发布时间】:2020-10-16 11:04:38 【问题描述】:

我正在尝试编译 2 个在 MacOs 上使用 OpenGL 和 fltk 的 .cpp 文件。 在使用 linux (Fedora) 的设备上,我使用以下命令: g++-9 -std=c++17 window.cpp prova.cpp -o test -lfltk -lGL -lglut -lGLU -lfltk_gl 一切正常。

在 Mac_Os 终端上,我尝试使用: g++ -framework GLUT -framework OpenGL -lGLU -lfltk -lglut -lGL -framework Cocoa window.cpp prova.cpp 我收到无数错误(我在 linux 上没有)和警告:

      (Define GL_SILENCE_DEPRECATION to silence these warnings) [-Wdeprecated-declarations]
inline void gl_rectf(int x,int y,int w,int h) glRecti(x,y,x+w,y+h);
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/System/Library/Frameworks/OpenGL.framework/Headers/gl.h:2588:13: note: 
      'glMatrixMode' has been explicitly marked deprecated here
extern void glMatrixMode (GLenum mode) OPENGL_DEPRECATED(10.0, 10.14);
            ^
prova.cpp:211:5: warning: 'glLoadIdentity' is deprecated: first deprecated in macOS 10.14 - OpenGL API deprecated. (Define
      GL_SILENCE_DEPRECATION to silence these warnings) [-Wdeprecated-declarations]
    glLoadIdentity();

现在,我还尝试使用我通过自制软件安装的 g++-10 执行以下操作:

g++-10 -framework OpenGL -framework GLUT window.cpp prova.cpp

但我明白了

    1 | #include <FL/Fl.H>
      |          ^~~~~~~~~
compilation terminated.
prova.cpp:9:10: fatal error: FL/gl.h: No such file or directory
    9 | #include <FL/gl.h>
      |          ^~~~~~~~~

(这可能是问题所在)所以我将自己包含在 fltk 库中:

g++-10 -framework OpenGL -framework GLUT -I /usr/local/Cellar/fltk/1.3.5/include window.cpp prova.cpp

现在得到一个战略输出:

Undefined symbols for architecture x86_64:
  "__Z12glutIdleFuncPFvvE", referenced from:
      __Z14CreateMyWindowiPPc in ccApCsrQ.o
  "__Z13glutSolidConeddii", referenced from:
      __Z11displayConev in ccyWlxbb.o
  "__Z15glutSwapBuffersv", referenced from:
      __Z11displayConev in ccyWlxbb.o
  "__Z16glutCreateWindowPKc", referenced from:
      __Z14CreateMyWindowiPPc in ccApCsrQ.o
  "__Z18glutInitWindowSizeii", referenced from: // .... and so on 

这是 macOS 中的一种错误,当您不包含框架时(我认为)。

有谁知道这是哪里的问题? (这 2 个 .cpp 文件在 linux 上完美运行,所以这是 MacOs 的问题)

【问题讨论】:

【参考方案1】:

与解决包含文件问题的-I /usr/local ....选项一起,尝试添加

-L /usr/local/Cellar/fltk/1.3.5/lib   (look up the exact folder name with .a and .so files)

可选的,它告诉 g++-10 包中的链接器在目录中查找库文件本身。此外,如果您明确链接到 FLTK,您可能必须使用 -lfltk

【讨论】:

好的,我试过“g++-10 -framework OpenGL -framework GLUT -L /usr/local/Cellar/fltk/1.3.5/lib -I /usr/local/Cellar/fltk/1.3 .5/include -lfltk window.cpp prova.cpp”和以“架构 x86_64 的未定义符号:”开头的列表变得非常短,但我仍然明白。你知道为什么吗? 现在您只安装了 32 位库(x86,而不是 x86_64),您必须重新编译/重新安装 x86_64 变体中的 FLTK。 我之前也得到了“架构 x86_64 的未定义符号:”(检查我的答案中的输出)。现在由于“架构 x86_64 的未定义符号:”而导致的错误列表要短得多:“__Z12glutIdleFuncPFvvE”,引用自:cciPnJdO.o 中的 __Z14CreateMyWindowiPPc “__Z13glutSolidConeddii”,引用自:cc1dj4Tw.o 中的 __Z11displayConev 等等... 可能,GLUT 也很旧(仅考虑您的错误消息)并且仅限 x86。尝试使用“nm/objdump”命令确保 GLUT 正确(在 glut 的 .a 或 .so 文件中运行它们。 Glut 是最新的。问题是在 macOS 上,您不推荐使用 OpenGL 和 glut,您需要使用框架编译它们。就像我想念那个框架

以上是关于使用 g++ 编译使用 fltk 和 OpenGL 的文件在 MacO 上会出错的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Ubuntu 中使用 g++ 编译 fltk 程序?

FLTK g++ 编译错误

opengl 中的透明度(使用 FLTK)

使用 FLTK 框架编译的问题

FLTK + OpenGL - 未绘制矩形

如何将 fltk 文件与其他文件一起编译?