Russian Qt Forum

Программирование => Общий => Тема начата: __Heaven__ от Июль 09, 2014, 14:12



Название: Ошибка компоновщика
Отправлено: __Heaven__ от Июль 09, 2014, 14:12
Здравствуйте, всем!
Прошу помочь мне разобраться с проблемой:
Я занимаюсь изучением OpenGL по Суперкниге и пишу примерчики из неё на Qt.
К проекту очередного примера мне было необходимо подтянуть несколько хэдэров и исходников из папки examples/common. Но тут столкнулся с ошибкой при компоновке
Код:
ошибка: undefined reference to `gltTransformPoint'
Сослался на свою "пряморукость" и попробовал запустить из под Qt Creator сам пример (без использования Qt) - не успех...
Понимаю, что ошибка, скорее всего, пустяковая, но в упор не вижу причины.

Предпринимал действия:
Запускал предложенный в примере файл проекта MSVC, приписывал расположение glut32 и он работал.
В папке примера выполнял qmake -project, в .pro файл прописывал glut32 - ошибка та же. Эти же действия на другом примере дали положительный результат.

Во вложении сам пример, общие файлы ко многим примерам из книги, библиотека glut с диска от книги.


Название: Re: Как правильно внести в проект файлы cpp и h
Отправлено: kambala от Июль 09, 2014, 17:49
может еще библиотеку надо подключить?


Название: Re: Как правильно внести в проект файлы cpp и h
Отправлено: Igors от Июль 09, 2014, 18:53
может еще библиотеку надо подключить?
А может еще скажете какую?  :)

2__Heaven__ Ну причем здесь cpp и h если Вы сами говорите "ошибка компоновщика". Просто тупо ищите все файлы в которых unresolved (gltTransform). Такого lib файла у Вас нет - значит надо его где-то доставать скачивать (а не пробовать компиляторы). Наберите в гугле напр "gltools library download" - вот первая ссылка, товарищ тоже ищет.


Название: Re: Как правильно внести в проект файлы cpp и h
Отправлено: __Heaven__ от Июль 09, 2014, 19:45
2__Heaven__ Ну причем здесь cpp и h если Вы сами говорите "ошибка компоновщика". Просто тупо ищите все файлы в которых unresolved (gltTransform). Такого lib файла у Вас нет - значит надо его где-то доставать скачивать (а не пробовать компиляторы). Наберите в гугле напр "gltools library download" - вот первая ссылка, товарищ тоже ищет.
Не смог сформулировать тему - переправил.

Дело в том, что такая функция определена в .c файле, который имеется в папке common. Я его тоже подтягивал в проект, но это не помогло...


Название: Re: Ошибка компоновщика
Отправлено: Igors от Июль 09, 2014, 20:02
Загрузил Ваш проект в MSVС 2012, добавил glut32.lib в проект, отключил SAFESH в линкере. Положил glut32.dll рядом с exe. Запускается, работает


Название: Re: Ошибка компоновщика
Отправлено: Bepec от Июль 09, 2014, 20:16
Морока с путями у вас скорее всего :)


Название: Re: Ошибка компоновщика
Отправлено: __Heaven__ от Июль 09, 2014, 21:17
Загрузил Ваш проект в MSVС 2012, добавил glut32.lib в проект, отключил SAFESH в линкере. Положил glut32.dll рядом с exe. Запускается, работает

Предпринимал действия:
Запускал предложенный в примере файл проекта MSVC, приписывал расположение glut32 и он работал.

Igors, меня больше интересует, почему у меня не получается выполнить пример именно в среде Qt Creator (mingw). Это переходит в спортивный интерес, так сказать :).

Морока с путями у вас скорее всего :)
Мне кажется, что нет. До этого момента я выполнил около десятка примеров с использованием glut... А здесь появились эти .c и .h... Я их перенес в папку с моим проектом.
Единственное, что меня сейчас интуитивно смущает, следующий код. В файле GLTools.h:
Код:
#include <windows.h>
#include <winnt.h>
#include <gl/gl.h>
#include <gl/gl.h>
Подключение к проекту с чистым примером QT += opengl не подходит... Возможно ли, что какая-то gl либа не подтягивается?


Название: Re: Ошибка компоновщика
Отправлено: kambala от Июль 09, 2014, 21:37
LIBS += -lglut32


Название: Re: Ошибка компоновщика
Отправлено: __Heaven__ от Июль 10, 2014, 06:43
LIBS += -lglut32
Это само собой. + -L"Путь к glut32"


Название: Re: Ошибка компоновщика
Отправлено: kambala от Июль 10, 2014, 13:31
чтобы заработало через креатор, пришлось выбросить Common\glut.h из pro и пару инклудов подправить (я по-другому расположил файлы). библиотеку я добавлял через Add Library...

выкладываю рабочий проект.


Название: Re: Ошибка компоновщика
Отправлено: Igors от Июль 10, 2014, 15:30
Igors, меня больше интересует, почему у меня не получается выполнить пример именно в среде Qt Creator (mingw). Это переходит в спортивный интерес, так сказать :).
Вероятно потому что хедер GLTools.h не очень грамотный. Если ф-ция определена в с файле, то в хедере она должна быть объявлена как extern "C". Попробуйте измененный хедер (аттач)

Подключение к проекту с чистым примером QT += opengl не подходит... Возможно ли, что какая-то gl либа не подтягивается?
Там своя OpenGL-песня (ES, ES2), с Вашим примером это наверняка несовместимо


Название: Re: Ошибка компоновщика
Отправлено: __Heaven__ от Июль 10, 2014, 17:29
Igors, меня больше интересует, почему у меня не получается выполнить пример именно в среде Qt Creator (mingw). Это переходит в спортивный интерес, так сказать :).
Вероятно потому что хедер GLTools.h не очень грамотный. Если ф-ция определена в с файле, то в хедере она должна быть объявлена как extern "C". Попробуйте измененный хедер (аттач)


не помогло, к сожалению...


Название: Re: Ошибка компоновщика
Отправлено: kambala от Июль 10, 2014, 17:57
что мешает взять готовый рабочий проект который я выложил?


Название: Re: Ошибка компоновщика
Отправлено: __Heaven__ от Июль 10, 2014, 19:58
что мешает взять готовый рабочий проект который я выложил?
Очень извиняюсь!!! Не заметил Вашего сообщения.
Попытался сейчас запустить Ваш код и ничего не получил...
См. аттач


Название: Re: Ошибка компоновщика
Отправлено: kambala от Июль 10, 2014, 20:38
у меня и дебаг и релиз работает. использую Qt 5.3.0 MSVC2012 OpenGL 32bit. похоже, что твоему mingw компилятору что-то не нравится.


Название: Re: Ошибка компоновщика
Отправлено: __Heaven__ от Июль 10, 2014, 21:08
у меня и дебаг и релиз работает. использую Qt 5.3.0 MSVC2012 OpenGL 32bit. похоже, что твоему mingw компилятору что-то не нравится.
Совершенно забыл, что у меня установлен компилятор MSVC2013. Я запустил Ваш код и он работает. Наверное, действительно, под MS лучше использовать MS компилятор...



Название: Re: Ошибка компоновщика
Отправлено: __Heaven__ от Июль 10, 2014, 21:10
Кстати! А файлы .lib, они компиляторозависимы?


Название: Re: Ошибка компоновщика
Отправлено: Old от Июль 10, 2014, 21:14
Кстати! А файлы .lib, они компиляторозависимы?
Да.


Название: Re: Ошибка компоновщика
Отправлено: __Heaven__ от Июль 10, 2014, 23:09
Меня удивляло и продолжает удивлять, тот факт, что я написал около 3 примеров с использованием той самой glut32.lib и они компилируются... как такое возможно?


Название: Re: Ошибка компоновщика
Отправлено: __Heaven__ от Июль 14, 2014, 09:25
Решил!
Для нормальной компиляции проекта понадобилось перед употреблением #include <glut.h> написать
Код:
#define _STDCALL_SUPPORTED
#define _M_IX86
Источник (http://oldwiki.mingw.org/index.php/Glut)


Название: Re: Ошибка компоновщика
Отправлено: __Heaven__ от Июль 21, 2014, 10:52
Решил!
Для нормальной компиляции проекта понадобилось перед употреблением #include <glut.h> написать
Код:
#define _STDCALL_SUPPORTED
#define _M_IX86
Источник (http://oldwiki.mingw.org/index.php/Glut)

Это мнение оказалось ошибочным.
Настоящая проблема оказалась такая:
Когда у меня файл с расширением .c, то всё компонуется на ура, а когда я его переименовываю в .cpp, то "привет, проблема".
Я так понимаю, что нужно искать какую-то директиву препроцессора? Или в какую сторону копать?


Название: Re: Ошибка компоновщика
Отправлено: Kurles от Июль 21, 2014, 11:11
Решил!
Для нормальной компиляции проекта понадобилось перед употреблением #include <glut.h> написать
Код:
#define _STDCALL_SUPPORTED
#define _M_IX86
Источник (http://oldwiki.mingw.org/index.php/Glut)

Это мнение оказалось ошибочным.
Настоящая проблема оказалась такая:
Когда у меня файл с расширением .c, то всё компонуется на ура, а когда я его переименовываю в .cpp, то "привет, проблема".
Я так понимаю, что нужно искать какую-то директиву препроцессора? Или в какую сторону копать?
Такая штука обычно, если пытаешься сишные заголовочные файлы к плюсовому проекту подключить. Попробуй так:
Код
C++ (Qt)
#ifdef __cplusplus
extern "C" {
#endif
 
// здесь заголовочные файлы
 
#ifdef __cplusplus
}
#endif
 




Название: Re: Ошибка компоновщика
Отправлено: Kurles от Июль 21, 2014, 11:13
дел, повтор


Название: Re: Ошибка компоновщика
Отправлено: __Heaven__ от Июль 21, 2014, 11:14
Такая штука обычно, если пытаешься сишные заголовочные файлы к плюсовому проекту подключить. Попробуй так:
Код
C++ (Qt)
#ifdef __cplusplus
extern "C" {
#endif
 
// &#1079;&#1076;&#1077;&#1089;&#1100; &#1079;&#1072;&#1075;&#1086;&#1083;&#1086;&#1074;&#1086;&#1095;&#1085;&#1099;&#1077; &#1092;&#1072;&#1081;&#1083;&#1099;
 
#ifdef __cplusplus
extern "C" {
#endif
 

Да, проблема оказалась во мне. Я пытался в одном проекте совместить файлы .c и .cpp. Не знал, что так делать нельзя.
P.S.: дошёл до этого сам, потом прочитал Ваше сообщение  :)