opengl - `glwMDrawingAreaWidgetClass'的多重定义

标签 opengl glx

我正在将一个在 IRIX 上编写的应用程序移植到 Linux(并成功移植到 AIX(多年前))。我发现的问题之一是 Linux 上不支持 glwMDrawingAreaWidgetClass(使用 glwDrawaingAreaWidgeClass no 'M')。所以我换了它。我在 Ubuntu 10.10 上构建了该应用程序。现在我正在尝试在 14.04 上构建(并且也在 15.10 上尝试过)。但我收到以下错误。

glwMDrawingAreaWidgetClass的多重定义。

我得到了十几个(左右)文件。问题是..我没有使用它。

因此,我以良好的调试方式问:发生了什么变化。 makefile 相同,文件也相同。它必须是库或编译器 (G++)。

我到处寻找(谷歌搜索)来找到这个错误。我还没有找到解决方案(甚至是问题)。

有人注意到这个了吗?我怀疑这是一个库问题。
我正在使用以下库来链接:..

-lxvw -ldot -lmath -lXm -lXt -lXext -lX11 -lglut -lGLU -lGL -lGLw -lm -lpthread。

前三个是我的。我尝试去除 glut、GLU、GL、GLw。 要么没有区别,要么我无法链接。我怀疑是GLw。

我正在静态链接。

谢谢

最佳答案

原因

变量glwMDrawingAreaWidgetClass在导入的每个目标文件中定义:

#include <Xm/Xm.h>
#include <GL/GLwMDrawA.h>

Is 定义于 /usr/include/GL/GLwDrawA.h :

GLAPI WidgetClass glwMDrawingAreaWidgetClass;

GLAPI 为 extern在 RHEL6 中,之前 this commit到台面 3D。尽你所能see , GLAPI是一个宏,定义为 __attribute__((visibility("default")))__GCC__ > 4/usr/include/gl.h .

修复

我不知道此更改在 glwMDrawingAreaWidgetClass 上是否正确,但修改/usr/include/GL/gl.h注释掉 GLAPI 的宏定义至__attribute__((visibility("default")))将允许文件后面的语句将其设置为 extern。这使得我的代码能够编译。

 #elif (defined(__GNUC__) && __GNUC__ >= 4) || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
-#  define GLAPI __attribute__((visibility("default")))
+//  define GLAPI __attribute__((visibility("default")))
 #  define GLAPIENTRY
 #endif /* WIN32 && !CYGWIN */

...

 #ifndef GLAPI
 #define GLAPI extern
 #endif

额外

我做了一个sample git repository用最少的代码演示该问题,只需两个目标文件。我已经给 Dan Nicholson 发了电子邮件,希望他能比我更详细地阐述这个问题。

关于opengl - `glwMDrawingAreaWidgetClass'的多重定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36562111/

相关文章:

c++ - 手动调用 OpenGL 函数

支持 OpenGL 的 C++ GUI 工具包

opengl - 在 OpenGL 中渲染透明对象

c++ - 将数据从后台缓冲区复制到前台缓冲区

linux - 使用 Linux 的海量直播视频流

c++ - 多线程环境中的 XSetWMProtocols 和 glXCreateContext 调用顺序

c++ - 基于 GLSL 的投影/模型 View 使对象不可见

c++ - 如何将OpenCV摄像机旋转 vector 转换为OpenGL旋转 vector ?

osx-lion - OS X Lion 中的 NV-GLX 缺少扩展

c++ - 在多个显示器上使用 GLX RHEL -- OpenGL、XLib 和多个显示器(带线程)