Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Хееелп ми! Code::Blocks + QT


Автор: JavaCraft 31.8.2007, 14:20
Что-то затрудняюсь прикрутить QT к Code::Blocks. Всё самых последних версий.
QT установлена и сконфигурирована по прилагаемой инструкции.
Ругнулась на компилятор MinGW, дескать граната не той системы "поддерживается 3....", а у меня 5.1.3.
Я проигнорировал предупреждение, подумал, что и этот сойдет. Просто пути к нему прописал.
MinGW установлен по интернету один из последних  (5.1.3)
Пути добавлены в Path, перезагружался.
По умолчанию в Code::Blocks используется GCC(G++ в списке нет). В опциях еще где-то упоминается что используется g++.
Code::Blocks ночной билд уже имеет плагин QT, пути, где нашел незаполненные поля, прописал вручную.
Вроде бы Code::Blocks(с плагином) должен сам вызывать qmake и генерить правильный Makefile.
Во всяком случае, я не нашел, где и как ему нужно это задать вручную.
Однако, я сравниваю его Makefile c результатом работы QDevelop и они очень сильно не похожи.

Создаю пустой QT4 проект в папках примеров qt\examples\...\..., добавляю туда C++ и h фалы.
Больше ничего не делаю.
При сборке получаю ошибку типа такой

"hellogl - Release" uses an invalid compiler. Skipping...
Nothing to be done.
Nothing to be done.

Как указать правильный компилятор не понимаю, и так всё уже указано.

Автор: Daevaorn 31.8.2007, 14:27
Цитата(JavaCraft @  31.8.2007,  15:20 Найти цитируемый пост)
Ругнулась на компилятор MinGW, дескать граната не той системы "поддерживается 3....", а у меня 5.1.3.


Цитата(JavaCraft @  31.8.2007,  15:20 Найти цитируемый пост)
"hellogl - Release" uses an invalid compiler. Skipping...

всё сходится

Автор: JavaCraft 31.8.2007, 14:39
Не факт. Чего это вдруг, такая жесткая привязка к древней, как [censored33! Пожалуйста, соблюдайте элементарные правила приличия при общении на форуме] мамонта версии?
Если QT так зависит от версии компилятора, то как ОНО
вообще может собираться с НУЖНЫМ МНЕ компилятором на НУЖНОЙ МНЕ платформе?
Времена меняются компиляторы обновляются, совместимость должна сохраняться.
Во всяком случае, регулярная установка последних стабильных версий любого ПО
как для никсов так и для винды это как правило хорошего тона. 


И еще непонятки.
Как в Code::Blocks использовать файлы QT-проектов *.pro?
При конфигурировании QT эти фалы используются, что видно из листинга.

Автор: JavaCraft 31.8.2007, 16:17
В общем не понятно зачем распространяется MinGW 5.1.3  и что с ним делать?

Убрал из Path путь к последней версии.
В Code::Blocks указал путь к его собственной версии MinGW, идущей в поставке и не совпадающей с требуемой для QT.
Лыжи поехали.

Теперь новая ошибка. Не понимает имена файлов.h без раширения
На строке 
#include <QGLWidget>
ошибка
:: === hellogl, Release ===
C:\dev\lib\Qt\4.2.3\examples\opengl\hellogl\glwidget.h:27: QGLWidget: No such file or directory
и т.д.

Изменять код примера, категорически не нужно.
Пути к qt\...\include, прописаны.

Автор: bsa 31.8.2007, 16:41
надо их дальше прописывать к дерикториям в include

Автор: JavaCraft 31.8.2007, 16:50
Да, это так! ((
Но ведь их много и это скучно.

Может есть опция, заставляющая искать во вложенных папках?

Автор: bsa 31.8.2007, 16:56
думаю, нет.

Автор: Daevaorn 31.8.2007, 17:00
Цитата(JavaCraft @  31.8.2007,  15:39 Найти цитируемый пост)
Если QT так зависит от версии компилятора, то как ОНО
вообще может собираться с НУЖНЫМ МНЕ компилятором на НУЖНОЙ МНЕ платформе?
Времена меняются компиляторы обновляются, совместимость должна сохраняться.
Во всяком случае, регулярная установка последних стабильных версий любого ПО
как для никсов так и для винды это как правило хорошего тона. 

Все эти рассуждения бессмыслены. QT от этого не заработает.

Автор: JavaCraft 31.8.2007, 17:16
Цитата(Daevaorn @  31.8.2007,  17:00 Найти цитируемый пост)
QT от этого не заработает. 

Согласен, но как его заставить? С MinGW проехали, сейчас я использую ту версию, которая идет с Code::Blocks.
С проблемой с путями к хедерам тоже разобрался.

Основная проблема в другом.
Как заставить Code::Blocks при работе с QT выполнять действия аналогичные QDevelop, чтобы Makefiles
получались идентичные или хотя бы приблизительно похожие?

Вот к примеру, что он мне выдает при линковке сейчас...
Очевидно, проблема с g++, лечится опциями, но какими?
Может быть qmake не отработал, который должен всё это настраивать?

-------------- Build: Release in hellogl ---------------
Compiling: main.cpp
Compiling: window.cpp
Compiling: glwidget.cpp
Linking executable: bin\Release\hellogl.exe
obj\Release\main.o:main.cpp:(.text+0xc9): undefined reference to `vtable for Window'
obj\Release\main.o:main.cpp:(.text+0xd5): undefined reference to `vtable for Window'
obj\Release\main.o:main.cpp:(.text+0x131): undefined reference to `vtable for Window'
obj\Release\main.o:main.cpp:(.text+0x13d): undefined reference to `vtable for Window'
obj\Release\window.o:window.cpp:(.text+0x198): undefined reference to `vtable for Window'
obj\Release\window.o:window.cpp:(.text+0x19f): more undefined references to `vtable for Window' follow
obj\Release\window.o:window.cpp:(.text+0x689): undefined reference to `Window::staticMetaObject'
obj\Release\window.o:window.cpp:(.text+0x858): undefined reference to `vtable for Window'
obj\Release\window.o:window.cpp:(.text+0x85f): undefined reference to `vtable for Window'
obj\Release\window.o:window.cpp:(.text+0xd49): undefined reference to `Window::staticMetaObject'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x53): undefined reference to `_imp___ZN9QGLWidgetC2EP7QWidgetPKS_6QFlagsIN2Qt10WindowTypeEE'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x70): undefined reference to `vtable for GLWidget'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x77): undefined reference to `vtable for GLWidget'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x1b2): undefined reference to `_imp___ZN9QGLWidgetD2Ev'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x223): undefined reference to `_imp___ZN9QGLWidgetC2EP7QWidgetPKS_6QFlagsIN2Qt10WindowTypeEE'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x240): undefined reference to `vtable for GLWidget'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x247): undefined reference to `vtable for GLWidget'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x382): undefined reference to `_imp___ZN9QGLWidgetD2Ev'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x3e3): undefined reference to `vtable for GLWidget'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x3ea): undefined reference to `vtable for GLWidget'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x3ef): undefined reference to `_imp___ZN9QGLWidget11makeCurrentEv'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x412): undefined reference to `glDeleteLists@8'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x425): undefined reference to `_imp___ZN9QGLWidgetD2Ev'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x458): undefined reference to `_imp___ZN9QGLWidgetD2Ev'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x4c3): undefined reference to `vtable for GLWidget'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x4ca): undefined reference to `vtable for GLWidget'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x4cf): undefined reference to `_imp___ZN9QGLWidget11makeCurrentEv'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x4f2): undefined reference to `glDeleteLists@8'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x505): undefined reference to `_imp___ZN9QGLWidgetD2Ev'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x538): undefined reference to `_imp___ZN9QGLWidgetD2Ev'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x5a3): undefined reference to `vtable for GLWidget'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x5aa): undefined reference to `vtable for GLWidget'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x5af): undefined reference to `_imp___ZN9QGLWidget11makeCurrentEv'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x5d2): undefined reference to `glDeleteLists@8'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x5e5): undefined reference to `_imp___ZN9QGLWidgetD2Ev'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x623): undefined reference to `_imp___ZN9QGLWidgetD2Ev'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x724): undefined reference to `GLWidget::xRotationChanged(int)'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x794): undefined reference to `GLWidget::yRotationChanged(int)'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x804): undefined reference to `GLWidget::zRotationChanged(int)'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x842): undefined reference to `glClear@4'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x84a): undefined reference to `glLoadIdentity@0'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x877): undefined reference to `glTranslated@24'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x8b2): undefined reference to `glRotated@32'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x8ed): undefined reference to `glRotated@32'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x928): undefined reference to `glRotated@32'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x936): undefined reference to `glCallList@4'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x993): undefined reference to `glViewport@16'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x9a2): undefined reference to `glMatrixMode@4'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x9aa): undefined reference to `glLoadIdentity@0'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x9ea): undefined reference to `glOrtho@48'
obj\Release\glwidget.o:glwidget.cpp:(.text+0x9f9): undefined reference to `glMatrixMode@4'
Process terminated with status 1 (0 minutes, 12 seconds)
50 errors, 0 warnings
 


Автор: Daevaorn 31.8.2007, 17:35
Линкер не находит библиотеки. Проверяй пути к ним.
И читай доку, быстрее найдешь решение.

Автор: JavaCraft 31.8.2007, 18:02
Цитата(Daevaorn @  31.8.2007,  17:35 Найти цитируемый пост)
Линкер не находит библиотеки

Какие библиотеки линковать? Я пытаюсь собрать с DLL. Пути к lib и bin прописаны.
Статические и динамические библиотеки имеются.
При отсутсвии DLL, ошибки, наверное, должны быть на этапе исполнения.


Цитата(Daevaorn @  31.8.2007,  17:35 Найти цитируемый пост)
И читай доку

В какой доке про это написано?

Автор: bsa 31.8.2007, 20:02
JavaCraft, вообще-то линковщику нужно указать какие библиотеки нужно будет использовать. Это делается в настройках проекта. В твоем случае нужно указать, как минимум QtOpenGL, Qtgui и QtCore

Автор: JavaCraft 3.9.2007, 11:25
Цитата(bsa @  31.8.2007,  20:02 Найти цитируемый пост)
JavaCraft, вообще-то линковщику нужно указать какие библиотеки нужно будет использовать. Это делается в настройках проекта. В твоем случае нужно указать, как минимум QtOpenGL, Qtgui и QtCore 


Это я сделал, а именно, в Release и Debug / Project Build Options / Linker Settings
Перечислил эти DLL с полными путями.

Ошибка осталась таже самая. smile 

Вопрос открыт. Как с наименьшими рутинными настройками (или вообще без них),
используя преимущества IDE и информацию из иерархии файлов проектов *.pro,
интегрировать библиотеку QT в Code::Blocks, который уже имеет QT-плагин?

Автор: bsa 3.9.2007, 12:24
JavaCraft, ты вообще когда-нибудь читаешь документацию?
1. Не надо указывать полные пути к либам (иначе проект будет непереносим на другие компы).
2. Надо указать в опциях линкера (в настройках среды, не проекта) директории, в которых расположены *.lib или *.a файлы, а не *.DLL!!!
3. Надо в опциях линкера (в настройках проекта) перечислить названия библиотек, без указания префикса lib.

Автор: JavaCraft 3.9.2007, 13:03
Цитата(bsa @  3.9.2007,  12:24 Найти цитируемый пост)
JavaCraft, ты вообще когда-нибудь читаешь документацию?
1. Не надо указывать полные пути к либам (иначе проект будет непереносим на другие компы).
2. Надо указать в опциях линкера (в настройках среды, не проекта) директории, в которых расположены *.lib или *.a файлы, а не *.DLL!!!
3. Надо в опциях линкера (в настройках проекта) перечислить названия библиотек, без указания префикса lib. 


1. Я и не указывал, и указывал, ничего не изменилось. Сейчас это не важно, пусть соберет хотя бы с абсолютными путями. Разницу я понимаю.

2.В "настройках среды", точнее в Global Compiler Settings / Search Directories /

Compiler - перечислил все пути к инклюдам, в том числе каждую папку каждой библиотеки QT (C:\dev\lib\Qt\4.2.3\include\QtOpenGL). Пути абсолютные, но пока это не важно.

Linker - перечислил пути к папкам lib и bin. Вообще то я не понимаю зачем нужны статические библиотеки, когда мне нужно собрать проект с динамическими библиотеками.
В паке lib содержатся только *.a и *.prl
в папке bin содержатся *.dll и прочее

3. Всяко пробовал. Сейчас сделал именно так - перечислил в свойствах проекта в опциях линкера нужные либы без путей и без расширений

Попытался пересобрать пример.
Ничего не изменилось. Тот-же листинг ошибок.

ps. Makefile даже не создается

ps.ps. QT конфигурировалась с опциями
configure.exe -release -shared -plugin-sql-sqlite -plugin-sql-odbc -qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libjpeg
Результат вроде бы нормальный.
переменная QMAKESPEC = win32-g++
PATH = ... c:\....\QT\4.2.3\bin

Автор: JackYF 3.9.2007, 14:53
Цитата(JavaCraft @  3.9.2007,  13:03 Найти цитируемый пост)
Linker - перечислил пути к папкам lib и bin. Вообще то я не понимаю зачем нужны статические библиотеки, когда мне нужно собрать проект с динамическими библиотеками.

в настройки проекта конкретные .lib-файлы qt-шные подключены?

Автор: JavaCraft 3.9.2007, 15:38
Цитата(JackYF @  3.9.2007,  14:53 Найти цитируемый пост)
в настройки проекта конкретные .lib-файлы qt-шные подключены? 

Конечно...

может быть путаница с компиляторами?

Раньше QT при сборке библиотеки по умолчанию использовался самый новый MinGW 5.1.3 (хотя QT на него по началу ругнулся, требовал MinGW 3.2.2, но собрался нормально). Но CodeBlock не захотел нормально работать с этой версией компилятора.
В CodeBlocks в bin есть собственная версия 3.2.4, с которой что-то как-то наконец заработало, но до указанных выше проблем.
Фиг с ним, хотя не порядок конечно с древней версией работать...

Сейчас переустанавливаю и пересобираю QT и конкретно указываю ему компилятор, который CodeBlock\bin. Причем QT ругается даже на него, хотя версии различаются только в третьем знаке. Ругается, но конфигурируется и собирается без ошибок. Перед сборкой qmake создал также Makefile.Release и Makefile.Debug по файлам проектов, для каждого примера в Examples

Вот теперь вопрос, как правильно и наиболее полно всё это добро использовать в IDE, чтобы не навредить?
Вот, что имеется в виду.

- Создаю проект QT4
- добавляю в проект имеющиеся C++ и H
- добавляю в настройки линкера список библиотек, в настройки компилятора пути к хедерам
- добавляю пути в глобальные настройки окружения
- В настройках проекта указываю, что использую Custom Makefile. Там галочка такая есть. Надеюсь задействовать имеющиеся файлы, которые сгенерировались при сборке библиотеки.

Что дальше? Уже этого много для цели "не навредить".

- что делать с шаблонами ($make -f $makefile $target) на вкладке "Make Commands" не знаю. Все переменные определены.
Вообще то всё это уже есть в Makefile, Makefile.Release, Makefile.Debug, я проверял.

Пытаюсь компилировать.
получаю ошибку
make.exe: *** No rule to make target `cleanRelease'.  Stop.
Process terminated with status 2 (0 minutes, 0 seconds)
0 errors, 0 warnings
 





Автор: JackYF 3.9.2007, 16:08
Цитата(JavaCraft @  3.9.2007,  15:38 Найти цитируемый пост)
Вот теперь вопрос, как правильно и наиболее полно всё это добро использовать в IDE, чтобы не навредить?

странновато очень... под Винды обычно много непонятных проблем с QT, как минимум вначале. Вот и сейчас я не пойму, чего ему не хватает...

Под линем у меня оно заработало из коробки, что называется...

Автор: MrCherry 10.9.2007, 21:21
блин.. у мен такая же проблема с компиляцией.. ругаетсяиз-за добавлении виртуальной функции в класс...

Автор: Keeper_B 11.9.2007, 02:10
Что то у вас какие то странные проблемы. У меня всё работает smile 
Попробуйте переустановить всё заново.
Насчёт работы с Qt я проект делаю так:
1. Выбираю проект Qt в "New from template".
2. Всё как обычно выбираю имя проекта, версии Build target, язык С++. Сохраняю проект.
3. Открываю командную строку "Программы -> Qt by Trolltech v4.3.1 (OpenSources) -> Qt 4.3.1 Command Prompt" и через неё захожу в католог где сохранил проект. 
Пишу команду qmake - project. 
Создаётся файл "имя_проекта.pro".
Если нужно редактирую его в блокноте (подробнее читайте документацию по Qt).
Пишу команду qmake.
Создаются файлы "Makefile, Makefile.Debug, Makefile.Release". Эти файлы это сценарии сборки программы.
Правлю их в месте где перечислины либы. Удаляю из конца записи букву "d". Например "-lqtmaind -lQtGuid4" -> "-lqtmain -lQtGui4"(это какой то видимо глюк!, так как эти буквы там нафиг ненужны).
4. Дальше что больше нравится smile либо компилируете прямо из командной строки командой "make" или Переходите опять в Code::Blocks. 
5. А там захоите в свойства проекта. Отмечаю галочкой пункт "This is a custom Makefile"(для того чтобы использовать файлы Makefile созданные программой qmake).
6. Собстно всё.

Удачи ;)

Добавлено через 2 минуты и 47 секунд
Да и ещё, если ваша прога ругаеться на отсутсвие какой нибудь библиотеки, уже при запуске, то надо найти эту либу и просто скопировать в тот же католог, где ваша программа.
Или в католог windows\system32.

Автор: JackYF 11.9.2007, 20:09
Цитата(Keeper_B @  11.9.2007,  02:10 Найти цитируемый пост)
(это какой то видимо глюк!, так как эти буквы там нафиг ненужны).

это названия библиотек с включенной дебаг-информацией. Но на практике, действительно, нафиг не надо.

Автор: Keeper_B 12.9.2007, 11:55
Цитата(JackYF @ 11.9.2007,  20:09)
Цитата(Keeper_B @  11.9.2007,  02:10 Найти цитируемый пост)
(это какой то видимо глюк!, так как эти буквы там нафиг ненужны).

это названия библиотек с включенной дебаг-информацией. Но на практике, действительно, нафиг не надо.

Странно почему она тогда на неё ругаеться?

Автор: JackYF 12.9.2007, 16:27
Цитата(Keeper_B @  12.9.2007,  11:55 Найти цитируемый пост)
Странно почему она тогда на неё ругаеться? 

потому что эти библиотеки наверняка не собраны, и их просто нет. Логично, что ругается smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)