我正在将一个在 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/