Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: kuzulis от Март 21, 2010, 21:25



Название: Qt4. SDK 2010.02.1. Windows. Проблемы со сборкой приложений.
Отправлено: kuzulis от Март 21, 2010, 21:25
Доброго времени суток.

Решил в Windows обновить себе SDK c qt-sdk-win-opensource-2009.04.exe на qt-sdk-win-opensource-2010.02.1.exe.

(т.е. сменить Qt4 v4.5.x на Qt4 v 4.6.2)

Установил, добавил для юзера переменную окружения:
Цитировать
PATH = c:\Qt\2010.02.1\qt\bin; c:\Qt\2010.02.1\mingw\bin

Добавил в c:\Qt\2010.02.1\qt\bin\ файл make.bat c таким содержимым:
Цитировать
@echo off
mingw32-make %*

пытаюсь собрать проект из консоли и получаю сюрприз:
Цитировать
D:\SVN\trunk>make
cd examples\reader\ && c:\Qt\2010.02.1\qt\bin\qmake.exe d:\SVN\trunk\examples\reader\reader.pro -win32 -o Makefile
cd examples\reader\ && mingw32-make -f Makefile
mingw32-make[1]: Entering directory `D:/SVN/trunk/examples/reader'
g++ -c -O2 -frtti -fexceptions -mthreads -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_NO_DEBUG -DQT_CORE_LIB -DQ
T_THREAD_SUPPORT -I"c:\Qt\2010.02.1\qt\include\QtCore" -I"c:\Qt\2010.02.1\qt\include" -I"..\..\qserialdevice" -I"c:\Qt\2
010.02.1\qt\include\ActiveQt" -I"..\..\build\bin\reader\moc" -I"c:\Qt\2010.02.1\qt\mkspecs\default" -o ..\..\build\bin\r
eader\obj\main.o main.cpp
windres -i version.rc -o ..\..\build\bin\reader\obj\version_res.o --include-dir=.
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-s -Wl,-subsystem,console -mthrea
ds -Wl -o ..\..\build\bin\reader\release\reader.exe ../../build/bin/reader/obj/main.o  -L"..\..\build\lib\qintegratedser
ialdevice\release" -L"c:\Qt\2010.02.1\qt\lib" ..\..\build\bin\reader\obj\version_res.o -lqserialdevice -lQtCore4
../../build/bin/reader/obj/main.o:main.cpp:(.text+0x267): undefined reference to `_imp___ZN14AbstractSerialC1EP7QObject'

../../build/bin/reader/obj/main.o:main.cpp:(.text+0x2c5): undefined reference to `_imp___ZN14AbstractSerial13setDeviceNa
meERK7QString'
../../build/bin/reader/obj/main.o:main.cpp:(.text+0x316): undefined reference to `_imp___ZNK14AbstractSerial10deviceName
Ev'
../../build/bin/reader/obj/main.o:main.cpp:(.text+0x6e9): undefined reference to `_imp___ZNK14AbstractSerial8baudRateEv'

../../build/bin/reader/obj/main.o:main.cpp:(.text+0x807): undefined reference to `_imp___ZNK14AbstractSerial8dataBitsEv'

../../build/bin/reader/obj/main.o:main.cpp:(.text+0x925): undefined reference to `_imp___ZNK14AbstractSerial6parityEv'
../../build/bin/reader/obj/main.o:main.cpp:(.text+0xa43): undefined reference to `_imp___ZNK14AbstractSerial8stopBitsEv'

../../build/bin/reader/obj/main.o:main.cpp:(.text+0xb61): undefined reference to `_imp___ZNK14AbstractSerial11flowContro
lEv'
../../build/bin/reader/obj/main.o:main.cpp:(.text+0xc79): undefined reference to `_imp___ZNK14AbstractSerial19charInterv
alTimeoutEv'
../../build/bin/reader/obj/main.o:main.cpp:(.text+0xd76): undefined reference to `_imp___ZN14AbstractSerial11setBaudRate
ENS_8BaudRateE'
../../build/bin/reader/obj/main.o:main.cpp:(.text+0x10a2): undefined reference to `_imp___ZNK14AbstractSerial10deviceNam
eEv'
../../build/bin/reader/obj/main.o:main.cpp:(.text+0x12d7): undefined reference to `_imp___ZN14AbstractSerial11setDataBit
sENS_8DataBitsE'
../../build/bin/reader/obj/main.o:main.cpp:(.text+0x141a): undefined reference to `_imp___ZN14AbstractSerial9setParityEN
S_6ParityE'
../../build/bin/reader/obj/main.o:main.cpp:(.text+0x1a7e): undefined reference to `_imp___ZN14AbstractSerial11setStopBit
sENS_8StopBitsE'
../../build/bin/reader/obj/main.o:main.cpp:(.text+0x1a97): undefined reference to `_imp___ZN14AbstractSerial14setFlowCon
trolENS_4FlowE'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [..\..\build\bin\reader\release\reader.exe] Error 1
mingw32-make[1]: Leaving directory `D:/SVN/trunk/examples/reader'
mingw32-make: *** [sub-examples-reader-make_default-ordered] Error 2

D:\SVN\trunk>

О_О...

Собирал также в QtCreator - результат тот-же.
Самое интересное, что в *.nix собирается без проблем, также отметить хочу, что без проблем тот же самый проект собирался и в Qt4 v4.5.x!!!

Кто-нибудь сталкивался с такой проблемой? Может дело в компиляторе MinGW v4.4.0 ?  >:(

---
т.е.  проект состоит из 2-х частей:
1. - это сборка статической библиотеки (сборка проходит успешно)
2. - это сборка самих приложений, использующих эту статическую библиотеку. Вот при шаге №2 вываливаются ошибки.



Название: Re: Qt4. SDK 2010.02.1. Windows. Проблемы со сборкой приложений.
Отправлено: niXman от Март 21, 2010, 21:55
Цитировать
AbstractSerial
это кто?


Название: Re: Qt4. SDK 2010.02.1. Windows. Проблемы со сборкой приложений.
Отправлено: kuzulis от Март 21, 2010, 22:08
Цитировать
это кто?

класс. см. проект : svn checkout svn://scm.fireforge.net/svnroot/qserialdevice


Название: Re: Qt4. SDK 2010.02.1. Windows. Проблемы со сборкой приложений.
Отправлено: cya-st от Март 21, 2010, 22:13
Может в переменных окружения указан путь на qtcreator\bin, не должно быть.


Название: Re: Qt4. SDK 2010.02.1. Windows. Проблемы со сборкой приложений.
Отправлено: kuzulis от Март 21, 2010, 22:18
Цитировать
Может в переменных окружения указан путь на qtcreator\bin, не должно быть.
не, не указан.


Название: Re: Qt4. SDK 2010.02.1. Windows. Проблемы со сборкой приложений.
Отправлено: cya-st от Март 21, 2010, 22:40
Цитировать
Может в переменных окружения указан путь на qtcreator\bin, не должно быть.
не, не указан.
Может не полностью удалена предыдущая версия Qt? Где-то остались старые библиотеки по всей видимости.


Название: Re: Qt4. SDK 2010.02.1. Windows. Проблемы со сборкой приложений.
Отправлено: kuzulis от Март 21, 2010, 23:20
Цитировать
Может не полностью удалена предыдущая версия Qt? Где-то остались старые библиотеки по всей видимости.
всё удалил из С:\Qt после анинсталла  :)


Название: Re: Qt4. SDK 2010.02.1. Windows. Проблемы со сборкой приложений.
Отправлено: lit-uriy от Март 22, 2010, 00:00
>>Добавил в c:\Qt\2010.02.1\qt\bin\ файл make.bat
добавить-то лучше было в c:\Qt\2010.02.1\mingw\bin
но это всё равно не должно, влиять, т.к. путь к c:\Qt\2010.02.1\mingw\bin виден через PATH.

Но впечатление действительно такое, как буд-то в PATH сидит ещё какой-то путь.
Посмотри что в консоли выведет path


Название: Re: Qt4. SDK 2010.02.1. Windows. Проблемы со сборкой приложений.
Отправлено: pastor от Март 22, 2010, 01:02
Цитировать
это кто?

класс. см. проект : svn checkout svn://scm.fireforge.net/svnroot/qserialdevice

А с какой версией Qt  собрана эта библиотека?


Название: Re: Qt4. SDK 2010.02.1. Windows. Проблемы со сборкой приложений.
Отправлено: kuzulis от Март 22, 2010, 08:25
Цитировать
А с какой версией Qt  собрана эта библиотека?
эммм... не понял что имеется ввиду?

она для сборки в Qt4. ( собирал от v4.1.x до v4.6.2 )


Название: Re: Qt4. SDK 2010.02.1. Windows. Проблемы со сборкой приложений.
Отправлено: lit-uriy от Март 22, 2010, 10:45
kuzulis, имеется в виду ты свою библиотеку собираешь одной и тойже версией Qt, что и приложение?


Название: Re: Qt4. SDK 2010.02.1. Windows. Проблемы со сборкой приложений.
Отправлено: kuzulis от Март 22, 2010, 11:18
Цитировать
kuzulis, имеется в виду ты свою библиотеку собираешь одной и тойже версией Qt, что и приложение?
Конечно :)


Название: Re: Qt4. SDK 2010.02.1. Windows. Проблемы со сборкой приложений.
Отправлено: kuzulis от Март 22, 2010, 11:51
Понял в чем проблема. Это мой касяк.

Я добавил в проект некий "финт" для того чтобы обеспечить возможность сборки библиотеки как в динамическом виде (MinGW или MSVC) так и в статическом виде.
Добавил в *.h файл своего экспортируемого класса это QSERIALDEVICE_EXPORT:
Код:
class QSERIALDEVICE_EXPORT AbstractSerial : public QIODevice
{
    Q_OBJECT
...
}

далее был создан файл: qserialdevice_global.h с таким содержанием:
Код:
#ifndef QSERIALDEVICEGLOBAL_H
#define QSERIALDEVICEGLOBAL_H

#include <QtCore/QtGlobal>

#if defined(QSERIALDEVICE_STATIC)
#  define QSERIALDEVICE_EXPORT
#elif defined(QSERIALDEVICE_SHARED)
#  define QSERIALDEVICE_EXPORT Q_DECL_EXPORT
#else
#  define QSERIALDEVICE_EXPORT Q_DECL_IMPORT
#endif

#endif // QSERIALDEVICEGLOBAL_H

далее в *.pro файл проекта (который собирает библиотеку) было добавлено следующее:
Код:
...
CONFIG          += staticlib
#CONFIG          += dll
...
...

#TODO: here in future replace
contains( CONFIG, staticlib ) {
    win32:DEFINES += QSERIALDEVICE_STATIC
}

#TODO: here in future replace
contains( CONFIG, dll ) {
    win32:DEFINES += QSERIALDEVICE_SHARED
    win32:RC_FILE   += version.rc
}
...
...

т.е. в таком виде сама библиотека то собирается (под Windows , MinGW) , но приложение с ней не линкуется!

Заработало только после того как я убрал : QSERIALDEVICE_EXPORT из *.h файла класса + закомментировал #include "qserialdevice_global.h" :(

Но в такой ситуации невозможна сборка библиотеки как динамической в MSVC.


т.е. с QSERIALDEVICE_EXPORT - невозможна линковка приложений с статической библиотекой, а без QSERIALDEVICE_EXPORT - невозможна сборка самой библиотеки как динамической в MSVC.

Замкнутый круг какой-то. Как решить проблему - не знаю :( . Нигде это не описано.


Название: Re: Qt4. SDK 2010.02.1. Windows. Проблемы со сборкой приложений.
Отправлено: kuzulis от Март 22, 2010, 12:43
Пока выход нашел такой:

1. в файле "qserialdevice_global.h" пишем:
Код:
#ifndef QSERIALDEVICEGLOBAL_H
#define QSERIALDEVICEGLOBAL_H

#include <QtCore/QtGlobal>

#if defined(QSERIALDEVICE_SHARED)
#  define QSERIALDEVICE_EXPORT Q_DECL_EXPORT
#endif

#endif // QSERIALDEVICEGLOBAL_H

2. в файле-хейдере класса пишем:
Код:
#if defined(QSERIALDEVICE_EXPORT)
class QSERIALDEVICE_EXPORT AbstractSerial : public QIODevice
#else
class AbstractSerial : public QIODevice
#endif
{
    Q_OBJECT
...
...
}

3. В файле проекта (*.pro) либы пишем:
Код:
...
CONFIG          += staticlib
#CONFIG          += dll
...
...
contains( CONFIG, dll ) {
    win32:DEFINES += QSERIALDEVICE_SHARED
    win32:RC_FILE   += version.rc
}
...
...

Cобирал в Windows с MinGW . Либа собирается (как статика так и динамика) и приложения с ней линкуются :)