2016-04-12 6 views
1

Я переношу приложение в Linux, написанное на IRIX (и успешно перенесено в AIX (годы назад)). Одна из проблем, которые я обнаружил, - это glwMDrawingAreaWidgetClass не поддерживается в Linux (используйте glwDrawaingAreaWidgeClass no 'M). Поэтому я переключил его. Я создал приложение на Ubuntu 10.10. Теперь я пытаюсь построить 14.04 (а также пробовал 15.10). Но я получаю следующую ошибку.множественное определение `glwMDrawingAreaWidgetClass '

Множественное определение glwMDrawingAreaWidgetClass.

Я получаю это для дюжины (или около того) файлов. Дело в том, что я НЕ использую его.

Так что в хорошем стиле отладки я спросил: что изменилось. Файловые файлы одинаковы, файлы одинаковые. Это должны быть библиотеки или компилятор (G ++).

Я искал всюду (поиск google), чтобы найти эту ошибку. Я не нашел решения (или даже проблемы).

Кто-нибудь это заметил? Я подозреваю, что это проблема библиотеки.
Я использую следующие библиотеки для связи: ..

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

Первые три являются моими. Я попытался удалить избыток, GLU, GL, GLw. Не имеет значения, или я не могу связать. Я подозреваю, что это GLw.

Я свяжусь статически.

Благодаря

+0

У вас все еще есть среда Ubuntu 10.10, которая ее компилирует? Вы можете попробовать обмен файлами между этой и вашей текущей установкой, чтобы увидеть, что работает. –

+0

Действительно ли это ошибка или просто предупреждение? Пожалуйста, укажите полное сообщение. –

+0

Это ошибка becaue collect2/ld возвращает ошибку (см. Конец) Вот часть сообщения - происходит несколько раз XExec.o: В функции 'XCommandBox :: ~ XCommandBox() ': /c/viewer/src/XExec.c: 83: множественное определение 'glwMDrawingAreaWidgetClass ' ViewerTestExec.o: /c/viewer/src/ViewerTestExec.c: 43: сначала определено здесь ViewerExec.o: В функции' Executor :: initialize () ': /c/vps/lib/libxvw.a(XWindow.o): В функции 'XWindow :: XWindow (WindowManager &)': /c/viewer/src/XWindow.c:57: множественное определение. .... collect2: error: ld вернулся 1 статус выхода – Thaddeus

ответ

0

У меня была такая же проблема с некоторым кодом, переносимой из IRIX некоторое время назад. Он компилирует и очень хорошо сочетается с RedHat 6, но не 7. Единственное релевантное различие, насколько я могу судить, заключается в том, что RedHat 6 использует gcc 4.4, в то время как RedHat 7 использует gcc 4.8.

+0

Привет. Я думаю, что моя проблема схожа. Я могу скомпилировать приложение на более ранней платформе Linux (более старый gcc), но не на моей последней платформе (более новая версия gcc). Моя «работа» (на данный момент) заключается в продолжении использования старой платформы для этого конкретного приложения. Когда я найду решение, я опубликую его. – Thaddeus

1

Причина

Переменная glwMDrawingAreaWidgetClass в настоящее время определяется в каждом файле объекта, который импортирует:

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

ли определена в /usr/include/GL/GLwDrawA.h:

GLAPI WidgetClass glwMDrawingAreaWidgetClass; 

GLAPI был в RHEL6 extern до this commit к mesa 3D. Как вы можете see, GLAPI является макросом, который определяется как __attribute__((visibility("default"))), когда __GCC__ > 4 в /usr/include/gl.h.

Fix

Я не знаю, если это изменение было собственно на glwMDrawingAreaWidgetClass, но изменение /usr/include/GL/gl.h закомментировать определение макроса из GLAPI в __attribute__((visibility("default"))) позволит заявление позже в файле, чтобы установить его экстерном. Это позволило компилировать мой код.

#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 

Extra

Я сделал sample git repository, чтобы продемонстрировать проблему с минимальным кодом, только два объектных файлов. Я отправил письмо Дэну Николсону в надежде, что он прольет больше света на этот вопрос, чем я могу.

Смежные вопросы