2

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

glwMDrawingAreaWidgetClass 的多重定义。

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

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

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

有没有人注意到这一点?我怀疑这是图书馆的问题。
我正在使用以下库来链接:..

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

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

我正在静态链接。

谢谢

4

2 回答 2

2

原因

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

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

是定义在/usr/include/GL/GLwDrawA.h

GLAPI WidgetClass glwMDrawingAreaWidgetClass;

在提交到 mesa 3D之前, GLAPIextern在 RHEL6 中。如您所见,是一个宏,定义为when in 。GLAPI__attribute__((visibility("default")))__GCC__ > 4/usr/include/gl.h

使固定

我不知道此更改是否适用于glwMDrawingAreaWidgetClass,但修改/usr/include/GL/gl.h以注释掉 to 的宏定义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

额外的

我制作了一个示例 git 存储库,用最少的代码演示了这个问题,只有两个目标文件。我已经给丹尼科尔森发了电子邮件,希望他能比我更清楚地说明这个问题。

于 2016-11-11T15:36:26.240 回答
0

前段时间从 IRIX 移植的一些代码也遇到了同样的问题。它可以很好地编译和链接 RedHat 6,但不是 7。据我所知,唯一相关的区别是 RedHat 6 使用 gcc 4.4,而 RedHat 7 使用 gcc 4.8。

于 2016-04-26T23:31:21.723 回答