Russian Qt Forum
Ноябрь 23, 2024, 16:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [CMake & Qt4] Неразрешенные ссылки при линковке (Win XP)  (Прочитано 8958 раз)
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.

Заранее всем спасибо за комментарии, ответы и советы!
Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Апрель 03, 2009, 14:18 »

Глянь ка сначало вот на это CMake как система сборки для Qt приложений
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
Grinchman
Гость
« Ответ #2 : Апрель 03, 2009, 14:29 »

На эту доку я наткнулся уже после того как написал свои CMakeList.txt файлы. Сравнил. У меня всё делается в точности также. Хёдеры из ui файлов генеряться нормально, moc файлы тоже.
UPD: Более того, для проверки генерил проектные файлы для студии и уже из студии проверял все настройки проекта для компиляции и линковки Qt. Инклуды до Qt прописаны, путь до либ тоже, сами либы прописаны в линковщик...
« Последнее редактирование: Апрель 03, 2009, 14:35 от Grinchman » Записан
crackedmind
Гость
« Ответ #3 : Апрель 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 овский объектник.
Записан
Rcus
Гость
« Ответ #4 : Апрель 03, 2009, 15:06 »

Вторая ошибка линковки напоминает пропущенный макрос Q_EXPORT_PLUGIN2
Записан
Grinchman
Гость
« Ответ #5 : Апрель 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)

Очень радует, что ушла большая часть ошибок ) Теперь разобраться бы с этими! )
Записан
Grinchman
Гость
« Ответ #6 : Апрель 04, 2009, 08:09 »

Вторая ошибка линковки напоминает пропущенный макрос Q_EXPORT_PLUGIN2
в плагине Basic этот макрос есть.
Код:
Q_EXPORT_PLUGIN2(basic, BasicProjectPlugin);
Записан
Grinchman
Гость
« Ответ #7 : Апрель 04, 2009, 08:36 »

Немного подкорректировал свои действия. Теперь, так как Qt собрана динамической, плагин Basic собрал как dll`ку. Но при этом ошибки линковки исполняемого main`а не ушли, по прежнему их 2.
Записан
Grinchman
Гость
« Ответ #8 : Апрель 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)
Записан
Grinchman
Гость
« Ответ #9 : Апрель 04, 2009, 09:12 »

Вопрос!
Если в апликухе используется Q_IMPORT_PLUGIN, то это значит, что зпроисходит попытка подлкючить статический плагин?
Записан
Grinchman
Гость
« Ответ #10 : Апрель 06, 2009, 11:35 »

Ну вот и собрал таки проект )
Как и предположил, плагин статический, Qt пришлось собрать статическим.
Единственное что огорчило в CMake - это, то что для плагина Basic препроцессорные флаги QT_PLUGIN и QT_STATICPLUGIN не выставляются с помощью процедур модуля FindQt4, пришлось "ручками" дописывать эти флаги.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.051 секунд. Запросов: 23.