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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: unresolved external при статической линковке  (Прочитано 14322 раз)
Nazgul
Гость
« : Октябрь 02, 2005, 15:58 »

Доброго времени суток!

Поставил под MVS 7.1 - Qt 4.0.0-win-commercial-VS2003 и интегратор.
Все работает нормально.
Но желательна была статическая линковка библиотек.
Отконфигурил с -static:
configure -static
nmake.

Теперь при билде проекта выводятся сообщения:
QtStatic error LNK2019: unresolved external symbol "private: static struct QString::Data QString::shared_null" (?shared_null@QString@@0UData@1@A) referenced in function "public: __thiscall QString::QString(char const *)" (??0QString@@QAE@PBD@Z)
QtStatic error LNK2001: unresolved external symbol "public: static struct QMetaObject const QWidget::staticMetaObject" (?staticMetaObject@QWidget@@2UQMetaObject@@B)
QtStatic error LNK2019: unresolved external symbol "private: static struct QByteArray::Data QByteArray::shared_null" (?shared_null@QByteArray@@0UData@1@A) referenced in function "public: __thiscall QByteArray::QByteArray(void)" (??0QByteArray@@QAE@XZ)
QtStatic error LNK2019: unresolved external symbol "public: static enum QSysInfo::WinVersion const QSysInfo::WindowsVersion" (?WindowsVersion@QSysInfo@@2W4WinVersion@1@B) referenced in function _WinMain@16

В чём может быть проблема?
Записан
zlatko
Гость
« Ответ #1 : Октябрь 03, 2005, 16:40 »

Если нетрудно попробуй с нуля пересобрать приложение. В 3 кт мне такой подход помогал
Записан
Nazgul
Гость
« Ответ #2 : Октябрь 03, 2005, 18:55 »

Не - тут не помогает. Создаю новый проект - ничего не добовляю (ну кроме того что он сам там создал) - пытаюсь откомпилировать - вываливаются ошибки.
Это с GUI приложением.

С консольным веселее: билдится нормально - но размер исходника 3.5  КБ - при запуске появляется сообщение о том что не найдена QtCore4.dll...
Записан
nEoN
Гость
« Ответ #3 : Октябрь 04, 2005, 09:17 »

В первом случае посмотри настройки проекта в MSVC++ Project Properties->Linker->Input->"Additional Dependencies". Скорее всего там отсутствует ссылка на библиотеку "C:\Qt\4.0.0\lib\QtCore4.lib" и "C:\Qt\4.0.0\lib\QtGui4.lib".

А во втором случае в переменную среды "PATH" надо добавить путь к библиотекам Qt.
Записан
Nazgul
Гость
« Ответ #4 : Октябрь 04, 2005, 17:23 »

Цитировать
В первом случае посмотри настройки проекта в MSVC++ Project Properties->Linker->Input->"Additional Dependencies". Скорее всего там отсутствует ссылка на библиотеку "C:\Qt\4.0.0\lib\QtCore4.lib" и "C:\Qt\4.0.0\lib\QtGui4.lib".


Там прописано следующее: qtmain.lib QtCore4.lib QtGui4.lib

Цитировать
А во втором случае в переменную среды "PATH" надо добавить путь к библиотекам Qt.

Это понятно - но я то компилировал консольный проект уже с реконфигурированной Qt с флагом -static - он же вроде как должен их с сабой носить... А он почему-то по старинке компилит без статического подключения библиотек...

Поставил себе Qt 4.0.1 - тут тоже в принципе несоскучишся:
"configure -static"   - выполнилось нормально
а вот после команды "nmake" - долго что-то компилилось и выдало:
вначале кучу ворнингов типа:
C:/Qt\4.0.1\tools\designer\src\lib\shared\qtundo.cpp(131) : warning C4273: 'QtCommand::QtCommand' : inconsistent dll linkage
C:/Qt\4.0.1\tools\designer\src\lib\shared\qtundo.cpp(146) : warning C4273: 'QtCommand::QtCommand' : inconsistent dll linkage
C:/Qt\4.0.1\tools\designer\src\lib\shared\qtundo.cpp(262) : warning C4273: 'QtCommand::mergeMeWith' : inconsistent dll linkage
C:/Qt\4.0.1\tools\designer\src\lib\shared\qtundo.cpp(417) : warning C4273: 'QtUndoStack::QtUndoStack' : inconsistent dll linkage
C:/Qt\4.0.1\tools\designer\src\lib\shared\qtundo.cpp(436) : warning C4273: 'QtUndoStack::commandAt' : inconsistent dll linkage
C:/Qt\4.0.1\tools\designer\src\lib\shared\qtundo.cpp(455) : warning C4273: 'QtUndoStack::isClean' : inconsistent dll linkage
C:/Qt\4.0.1\tools\designer\src\lib\shared\qtundo.cpp(481) : warning C4273: 'QtUndoStack::setClean' : inconsistent dll linkage
C:/Qt\4.0.1\tools\designer\src\lib\shared\qtundo.cpp(502) : warning C4273: 'QtUndoStack::beforeChange' : inconsistent dll linkage
C:/Qt\4.0.1\tools\designer\src\lib\shared\qtundo.cpp(514) : warning C4273: 'QtUndoStack::afterChange' : inconsistent dll linkage

после ворнингов:
cl return error 0x2.....
Записан
Nazgul
Гость
« Ответ #5 : Октябрь 04, 2005, 19:15 »

С  "warning C4273: 'QtUndoStack::setClean' : inconsistent dll linkage"
в 4.0.1 вроде справился вызовом "nmake /I".
Вроде всё дальше нормально было - но теперь при билде проекта опять теже самые ошибки:  Грустный
QtStatic error LNK2019: unresolved external symbol "private: static struct QString::Data QString::shared_null" (?shared_null@QString@@0UData@1@A) referenced in function "public: __thiscall QString::QString(char const *)" (??0QString@@QAE@PBD@Z)
QtStatic error LNK2001: unresolved external symbol "public: static struct QMetaObject const QWidget::staticMetaObject" (?staticMetaObject@QWidget@@2UQMetaObject@@B)
QtStatic error LNK2019: unresolved external symbol "private: static struct QByteArray::Data QByteArray::shared_null" (?shared_null@QByteArray@@0UData@1@A) referenced in function "public: __thiscall QByteArray::QByteArray(void)" (??0QByteArray@@QAE@XZ)
QtStatic error LNK2019: unresolved external symbol "public: static enum QSysInfo::WinVersion const QSysInfo::WindowsVersion" (?WindowsVersion@QSysInfo@@2W4WinVersion@1@B) referenced in function _WinMain@16
Записан
Nazgul
Гость
« Ответ #6 : Октябрь 04, 2005, 19:50 »

проблема решилась.
мда... неожидал немного такого...
наконец-то стукнуло в бошку глянуть как там в экзамплах - и почему-то в экзамплах в "Project Properties->Linker->Input->"Additional Dependencies" вместо стандартных:
qtmain.lib QtCore4.lib QtGui4.lib
были прописаны:
C:\Qt\4.0.1\lib\qtmaind.lib C:\Qt\4.0.1\lib\QtCored.lib C:\Qt\4.0.1\lib\QtGuid.lib kernel32.lib user32.lib shell32.lib uuid.lib ole32.lib advapi32.lib ws2_32.lib gdi32.lib comdlg32.lib oleaut32.lib imm32.lib winmm.lib winspool.lib msimg32.lib

теперь всё нормально линкуется и пустое окошко занимает 3,8М - что не может не радовать  Крутой
Записан
ukc
Гость
« Ответ #7 : Октябрь 05, 2005, 11:10 »

Вот сюда решил перебраться, в старом топике всё больше где qt достать обсуждают.

Про техподдержку я имел ввиду тот факт, что в их листе рассылки куча вопросов о несобирающейся статически QT, которые стоят без ответов.

Я неверно понял, у меня действительно только 3 qtшные либы были в списке либ. Добавил остальные - всё слинковалось.

А dllины эти (msvcp71.dll и msvcr71.dll) вроде как содержат CRT, и по идее должны замещаться либами через Project Options->C++->Code Generation->Runtime Library. Если поставить Multithread (статическую), прокет не линкуется =(.
Записан
Nazgul
Гость
« Ответ #8 : Октябрь 05, 2005, 15:02 »

Цитировать
Про техподдержку я имел ввиду тот факт, что в их листе рассылки куча вопросов о несобирающейся статически QT, которые стоят без ответов.

Я это тоже заметил. Но я так думаю что всё это неспроста. При проблемах статической линковке в других компиляторах (не в MVS ) помощь видна - а вот для MVS - глубоко молчание... Скорее всего потому что для MVS всё платное - и у кого проблемы - и кто заплатил - смело связует с техподдержкой конторы - и ему мигом отвечают - а если  вопрос задется в общем форуме - то с тех поддержки канешно отвечать не буду - я так думаю они даже подчищают сообщения - я када лазил по сообщениям - видел как интересные темы просто пустые - даже без вопроса (а на месте вопроса и ответа какие-то <text clear>) стоит!  :lol:

Цитировать
А dllины эти (msvcp71.dll и msvcr71.dll) вроде как содержат CRT, и по идее должны замещаться либами через Project Options->C++->Code Generation->Runtime Library. Если поставить Multithread (статическую), прокет не линкуется =(.

"Multithread (статическую)" - это какой флаг - /MD?

канешно "nmake /I" - это "грубо и непрофессионально" - но пока другого выхода не вижу. Брал экзамплы с Qt и перебилдивал - вроде работают...
Наверное нужно "пофантазировать на тему" preprocessor directive как пишут - что нужно что-то определить чтобы нужные строки компились в макросах - но дапустим при использовании в препроцессоре команды QT_MAKEDLL - при "nmake" - возникают вообще другие ошибки:
embed.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: int __thiscall QImage::width(void)const " (__imp_?width@QImage@@QBEHXZ) referenced in function "public: void __thiscall Ui3Reader::embed(char const *,class QStringList const &)" (?embed@Ui3Reader@@QAEXPBDABVQStringList@@@Z)
embed.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall QImage::~QImage(void)" (__imp_??1QImage@@UAE@XZ) referenced in function "public: void __thiscall Ui3Reader::embed(char const *,class QStringList const &)" (?embed@Ui3Reader@@QAEXPBDABVQStringList@@@Z)
embed.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: bool __thiscall QImage::load(class QString const &,char const *)" (__imp_?load@QImage@@QAE_NABVQString@@PBD@Z) referenced in function "public: void __thiscall Ui3Reader::embed(char const *,class QStringList const &)" (?embed@Ui3Reader@@QAEXPBDABVQStringList@@@Z)
embed.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: __thiscall QImage::QImage(void)" (__imp_??0QImage@@QAE@XZ) referenced in function "public: void __thiscall Ui3Reader::embed(char const *,class QStringList const &)" (?embed@Ui3Reader@@QAEXPBDABVQStringList@@@Z)
..\..\..\bin\uic3.exe : fatal error LNK1120: 98 unresolved externals
NMAKE : fatal error U1077: 'link' : return code '0x460'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files\Microsoft Visual Studio .NET 2003\
VC7\BIN\nmake.exe"' : return code '0x2'
Stop.

Та и особо не пофантазируеш - на млоём атлоне 2.2Г по часу-полтора билдится....
Записан
Rainbow
Гость
« Ответ #9 : Октябрь 06, 2005, 10:15 »

У меня во временя маздая похожее было. Как оказалось прична upgrade VS 2002 -> 2003. Решилось очень жестоко: переинсталяцией маздая.
Если менял студию, то можешь не сомневатся в чем проблема.
Записан
Nazgul
Гость
« Ответ #10 : Октябрь 06, 2005, 17:31 »

Винду переустанавливал совсем недавано. И ставил на неё токо 2003-ю. Больше ничего (для 6-ой и 2005 бета2 - другой винт - другая система Улыбающийся ). Та и наврятли в этом - тут возможно что-то с макросами не-то - может при конфигурировании какой-нить макрос нужно определить,  то ли ошибка у них в исходниках... Причём это для 4.0.1.

4.0.0 и билдится со -static и проекты компилируются нормально... Вот подумываю сравнить qglobal.h этиз версий - сёдня вечерком посмотрю - мож так что нить прояснится....
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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