Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: Grinchman от Апрель 03, 2009, 14:11



Название: [CMake & Qt4] Неразрешенные ссылки при линковке (Win XP)
Отправлено: Grinchman от Апрель 03, 2009, 14:11
Всем привет!

Что имеем:
Core - ядро, собирается как статическая либа
Basic - плагин, собираю просто как статическую либу
Main - исполняемая апликуха, которая подтягивает обе вышеуказанных либы.

Makefile`ы  к каждому проекту генерирую с помощью CMake.

Что получаем:
Ядро и плагин нормальное собираются как либы.
Main компилируется без ошибок, этап линковки выдает следующее:
Код:
2>Compiling...
2>main.cpp
2>Compiling manifest to resources...
2>Linking...
2>main.obj : error LNK2019: unresolved external symbol "int __cdecl qInitResources_xsdeditor(void)" (?qInitResources_xsdeditor@@YAHXZ) referenced in function _main
2>main.obj : error LNK2019: unresolved external symbol "class QObject * __cdecl qt_plugin_instance_basic(void)" (?qt_plugin_instance_basic@@YAPAVQObject@@XZ) referenced in function "public: __thiscall StaticbasicPluginInstance::StaticbasicPluginInstance(void)" (??0StaticbasicPluginInstance@@QAE@XZ)
2>core.lib(GlobalSettings.cpp.obj) : error LNK2001: unresolved external symbol "public: virtual struct QMetaObject const * __thiscall GlobalSettings::metaObject(void)const " (?metaObject@GlobalSettings@@UBEPBUQMetaObject@@XZ)
2>core.lib(GlobalSettings.cpp.obj) : error LNK2001: unresolved external symbol "public: virtual void * __thiscall GlobalSettings::qt_metacast(char const *)" (?qt_metacast@GlobalSettings@@UAEPAXPBD@Z)
2>core.lib(GlobalSettings.cpp.obj) : error LNK2001: unresolved external symbol "public: virtual int __thiscall GlobalSettings::qt_metacall(enum QMetaObject::Call,int,void * *)" (?qt_metacall@GlobalSettings@@UAEHW4Call@QMetaObject@@HPAPAX@Z)
2>core.lib(GlobalSettings.cpp.obj) : error LNK2019: unresolved external symbol "protected: void __thiscall GlobalSettings::settingsChanged(void)" (?settingsChanged@GlobalSettings@@IAEXXZ) referenced in function "public: void __thiscall GlobalSettings::refresh(void)" (?refresh@GlobalSettings@@QAEXXZ)
2>core.lib(XSDEditor.cpp.obj) : error LNK2019: unresolved external symbol "public: static struct QMetaObject const XSDEditor::staticMetaObject" (?staticMetaObject@XSDEditor@@2UQMetaObject@@B) referenced in function "public: static class QString __cdecl XSDEditor::tr(char const *,char const *)" (?tr@XSDEditor@@SA?AVQString@@PBD0@Z)

и т.д.

Вопросы
1) Что есть такое Qt-плагин для компилятора? Обычная либа или может dll`ка? Тоесть что-то надо сообщать компилятору специфическое, чтобы как-то обозначить, что собираемый проект - плагин?
2) Ошибки линковки касаются в основном обычной статической либы core.lib, тоесть по-большей части проблема не в плагине,а впринципе в линковке Qt. Что может их вызывать, если учитывать, что и Qt и либы собирались одним и тем же студийным компилятором (VC8)?
3) Может ли мне просто напросто не хватать каких-то специфических Qt-шных либ? Я линкую: qtmain, Qt3Support, QtCore, QtGui, QtXml, QtSql, QtNetwork.

Заранее всем спасибо за комментарии, ответы и советы!


Название: Re: [CMake & Qt4] Неразрешенные ссылки при линковке (Win XP)
Отправлено: pastor от Апрель 03, 2009, 14:18
Глянь ка сначало вот на это CMake как система сборки для Qt приложений (http://prog.org.ru/wiki/index.php?title=CMake_%D0%BA%D0%B0%D0%BA_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D1%81%D0%B1%D0%BE%D1%80%D0%BA%D0%B8_%D0%B4%D0%BB%D1%8F_Qt_%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D0%B9)


Название: Re: [CMake & Qt4] Неразрешенные ссылки при линковке (Win XP)
Отправлено: Grinchman от Апрель 03, 2009, 14:29
На эту доку я наткнулся уже после того как написал свои CMakeList.txt файлы. Сравнил. У меня всё делается в точности также. Хёдеры из ui файлов генеряться нормально, moc файлы тоже.
UPD: Более того, для проверки генерил проектные файлы для студии и уже из студии проверял все настройки проекта для компиляции и линковки Qt. Инклуды до Qt прописаны, путь до либ тоже, сами либы прописаны в линковщик...


Название: Re: [CMake & Qt4] Неразрешенные ссылки при линковке (Win XP)
Отправлено: crackedmind от Апрель 03, 2009, 14:41
Цитировать
1) Что есть такое Qt-плагин для компилятора? Обычная либа или может dll`ка? Тоесть что-то надо сообщать компилятору специфическое, чтобы как-то обозначить, что собираемый проект - плагин?
Чаще всего dll'a, если Qt скомпиленно статически, то lib'a.

В qmake это указывается так:
Код:
CONFIG += qt plugin

Цитировать
2) Ошибки линковки касаются в основном обычной статической либы core.lib, тоесть по-большей части проблема не в плагине,а впринципе в линковке Qt. Что может их вызывать, если учитывать, что и Qt и либы собирались одним и тем же студийным компилятором (VC8)?
Ну 3 или 4 ошибки относится к тому что не может прилинковать moc овский объектник.


Название: Re: [CMake & Qt4] Неразрешенные ссылки при линковке (Win XP)
Отправлено: Rcus от Апрель 03, 2009, 15:06
Вторая ошибка линковки напоминает пропущенный макрос Q_EXPORT_PLUGIN2


Название: Re: [CMake & Qt4] Неразрешенные ссылки при линковке (Win XP)
Отправлено: Grinchman от Апрель 04, 2009, 08:03
Немного продвинулся с решение проблем. moc-файлы действительно были косячные, ибо генерить я их пытался из cpp-шников. Исправил на h-шники генерацию.  Moc-файлы генеряться нормальные, не пустые. В компиляцию добавляю и их и обычные cpp-шники.
Из за нервов вчера убил статический Qt, поставил обычный динамический (configure -release). Далее, собираю Core и плагин Basic как и раньше (в виде статических либ). Линковка испольняемого проекта Main выдает следующее:
Код:
2>Linking...
2>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
2>main.obj : error LNK2019: unresolved external symbol "int __cdecl qInitResources_xsdeditor(void)" (?qInitResources_xsdeditor@@YAHXZ) referenced in function _main
2>main.obj : error LNK2019: unresolved external symbol "class QObject * __cdecl qt_plugin_instance_basic(void)" (?qt_plugin_instance_basic@@YAPAVQObject@@XZ) referenced in function "public: __thiscall StaticbasicPluginInstance::StaticbasicPluginInstance(void)" (??0StaticbasicPluginInstance@@QAE@XZ)

Очень радует, что ушла большая часть ошибок ) Теперь разобраться бы с этими! )


Название: Re: [CMake & Qt4] Неразрешенные ссылки при линковке (Win XP)
Отправлено: Grinchman от Апрель 04, 2009, 08:09
Вторая ошибка линковки напоминает пропущенный макрос Q_EXPORT_PLUGIN2
в плагине Basic этот макрос есть.
Код:
Q_EXPORT_PLUGIN2(basic, BasicProjectPlugin);


Название: Re: [CMake & Qt4] Неразрешенные ссылки при линковке (Win XP)
Отправлено: Grinchman от Апрель 04, 2009, 08:36
Немного подкорректировал свои действия. Теперь, так как Qt собрана динамической, плагин Basic собрал как dll`ку. Но при этом ошибки линковки исполняемого main`а не ушли, по прежнему их 2.


Название: Re: [CMake & Qt4] Неразрешенные ссылки при линковке (Win XP)
Отправлено: Grinchman от Апрель 04, 2009, 09:00
Вести с полей:
Разобрался со второй ошибкой линковки (qInitResources_xsdeditor(void)). Оказывается в проекте либы Core затисался xsdeditor.qrc, который для самой коры не представляет интереса, поэтому она спокойно собирается без соответствующего cpp-шника. Добавил с CMakе`овский файл Коры этот ресурсный файл, либа собралась. А при линковке исполняемого Main`а ушла одна ошибка линковки.
Теперь картина выглядит вот так:
Код:
2>Linking...
2>main.obj : error LNK2019: unresolved external symbol "class QObject * __cdecl qt_plugin_instance_basic(void)" (?qt_plugin_instance_basic@@YAPAVQObject@@XZ) referenced in function "public: __thiscall StaticbasicPluginInstance::StaticbasicPluginInstance(void)" (??0StaticbasicPluginInstance@@QAE@XZ)


Название: Re: [CMake & Qt4] Неразрешенные ссылки при линковке (Win XP)
Отправлено: Grinchman от Апрель 04, 2009, 09:12
Вопрос!
Если в апликухе используется Q_IMPORT_PLUGIN, то это значит, что зпроисходит попытка подлкючить статический плагин?


Название: Re: [CMake & Qt4] Неразрешенные ссылки при линковке (Win XP)
Отправлено: Grinchman от Апрель 06, 2009, 11:35
Ну вот и собрал таки проект )
Как и предположил, плагин статический, Qt пришлось собрать статическим.
Единственное что огорчило в CMake - это, то что для плагина Basic препроцессорные флаги QT_PLUGIN и QT_STATICPLUGIN не выставляются с помощью процедур модуля FindQt4, пришлось "ручками" дописывать эти флаги.