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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt4. SDK 2010.02.1. Windows. Проблемы со сборкой приложений.  (Прочитано 9067 раз)
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« : Март 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 вываливаются ошибки.

« Последнее редактирование: Март 21, 2010, 21:31 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
niXman
Гость
« Ответ #1 : Март 21, 2010, 21:55 »

Цитировать
AbstractSerial
это кто?
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #2 : Март 21, 2010, 22:08 »

Цитировать
это кто?

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

ArchLinux x86_64 / Win10 64 bit
cya-st
Гость
« Ответ #3 : Март 21, 2010, 22:13 »

Может в переменных окружения указан путь на qtcreator\bin, не должно быть.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #4 : Март 21, 2010, 22:18 »

Цитировать
Может в переменных окружения указан путь на qtcreator\bin, не должно быть.
не, не указан.
Записан

ArchLinux x86_64 / Win10 64 bit
cya-st
Гость
« Ответ #5 : Март 21, 2010, 22:40 »

Цитировать
Может в переменных окружения указан путь на qtcreator\bin, не должно быть.
не, не указан.
Может не полностью удалена предыдущая версия Qt? Где-то остались старые библиотеки по всей видимости.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #6 : Март 21, 2010, 23:20 »

Цитировать
Может не полностью удалена предыдущая версия Qt? Где-то остались старые библиотеки по всей видимости.
всё удалил из С:\Qt после анинсталла  Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Март 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
Записан

Юра.
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #8 : Март 22, 2010, 01:02 »

Цитировать
это кто?

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

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

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #9 : Март 22, 2010, 08:25 »

Цитировать
А с какой версией Qt  собрана эта библиотека?
эммм... не понял что имеется ввиду?

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

ArchLinux x86_64 / Win10 64 bit
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #10 : Март 22, 2010, 10:45 »

kuzulis, имеется в виду ты свою библиотеку собираешь одной и тойже версией Qt, что и приложение?
Записан

Юра.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #11 : Март 22, 2010, 11:18 »

Цитировать
kuzulis, имеется в виду ты свою библиотеку собираешь одной и тойже версией Qt, что и приложение?
Конечно Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #12 : Март 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.

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

ArchLinux x86_64 / Win10 64 bit
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #13 : Март 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 . Либа собирается (как статика так и динамика) и приложения с ней линкуются Улыбающийся
« Последнее редактирование: Март 22, 2010, 12:46 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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