Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Qt: юникод, не могу слинковать статическую либу 
V
    Опции темы
Alca
Дата 29.11.2012, 01:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



Qt 4.8.2, QtCreator 2.5.2, Win7 SP1, юникод, не могу слинковать статическую либу.

pro-file
Код

#---------------------------------------------------------------------------
#
# \file  iTeacher.pro
# \brief project file
#
#---------------------------------------------------------------------------


TARGET          = iTeacher
TEMPLATE        = app
QT              = core gui sql network xml
CONFIG         += warn_on

win32 {
    INCLUDEPATH = "$$(xLib)/Project/Include"

    CONFIG(debug, debug|release) {
        LIBS    = "$$(xLib)/Build/Libs/VC++2010/Debug/StaticLib_VC++2010.lib"
    } else {
        LIBS    = "$$(xLib)/Build/Libs/VC++2010/Release/StaticLib_VC++2010.lib"
    }

    LIBS       += User32.lib Ole32.lib Advapi32.lib shell32.lib
}
unix {
    INCLUDEPATH =

    CONFIG(debug, debug|release) {
        LIBS    = -lxlib_d
    } else {
        LIBS    = -lxlib_r
    }

    LIBS       +=
}

HEADERS         = Config.h \
                  QtLib/Common.h \
                  Classes/CUtils.h \
                  Classes/CSqlNavigator.h \
                  Classes/CCheckBoxItemDelegate.h \
                  Classes/CCenteredCheckBox.h \
                  Forms/CMain.h \
                  Forms/CWordEditor.h \
                  Forms/CWordFinder.h

SOURCES         = main.cpp \
                  Classes/CUtils.cpp \
                  Classes/CSqlNavigator.cpp \
                  Classes/CCheckBoxItemDelegate.cpp \
                  Classes/CCenteredCheckBox.cpp \
                  Forms/CMain.cpp \
                  Forms/CWordEditor.cpp \
                  Forms/CWordFinder.cpp

FORMS           = Forms/CMain.ui \
                  Forms/CWordEditor.ui \
                  Forms/CWordFinder.ui

RESOURCES       = Resources/App.qrc

win32 {
    RC_FILE     = Resources/App_win.rc
}
unix {
    RC_FILE     = # n/a
}

OUT_DIR         =

CONFIG(debug, debug|release) {
    OUT_DIR    = ./Build/Debug
} else {
    OUT_DIR    = ./Build/Release
}

DESTDIR         = "$$OUT_DIR/Distr"
MOC_DIR         = "$$OUT_DIR/Temp"
OBJECTS_DIR     = "$$OUT_DIR/Temp"
RCC_DIR         = "$$OUT_DIR/Temp"
UI_DIR          = "$$OUT_DIR/Ui"


Compile output:
Код

...

cl -c -nologo -Zm200 -Zc:wchar_t- -Zi -MDd -W3 -w34100 -w34189 -GR -EHsc -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_SQL_LIB -DQT_XML_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"..\..\..\Libs\Qt\4.8.2_msvc2010\include\QtCore" -I"..\..\..\Libs\Qt\4.8.2_msvc2010\include\QtNetwork" -I"..\..\..\Libs\Qt\4.8.2_msvc2010\include\QtGui" -I"..\..\..\Libs\Qt\4.8.2_msvc2010\include\QtXml" -I"..\..\..\Libs\Qt\4.8.2_msvc2010\include\QtSql" -I"..\..\..\Libs\Qt\4.8.2_msvc2010\include" -I"..\..\xLib\Project\Include" -I"..\..\..\Libs\Qt\4.8.2_msvc2010\include\ActiveQt" -I"Build\Debug\Temp" -I"Build\Debug\Ui" -I"..\..\..\Libs\Qt\4.8.2_msvc2010\mkspecs\win32-msvc2010" -FoBuild\Debug\Temp\ @C:\TEMP\moc_CMain.obj.6868.6895.jom
moc_CMain.cpp
    cl -c -nologo -Zm200 -Zc:wchar_t- -Zi -MDd -W3 -w34100 -w34189 -GR -EHsc -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_SQL_LIB -DQT_XML_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"..\..\..\Libs\Qt\4.8.2_msvc2010\include\QtCore" -I"..\..\..\Libs\Qt\4.8.2_msvc2010\include\QtNetwork" -I"..\..\..\Libs\Qt\4.8.2_msvc2010\include\QtGui" -I"..\..\..\Libs\Qt\4.8.2_msvc2010\include\QtXml" -I"..\..\..\Libs\Qt\4.8.2_msvc2010\include\QtSql" -I"..\..\..\Libs\Qt\4.8.2_msvc2010\include" -I"..\..\xLib\Project\Include" -I"..\..\..\Libs\Qt\4.8.2_msvc2010\include\ActiveQt" -I"Build\Debug\Temp" -I"Build\Debug\Ui" -I"..\..\..\Libs\Qt\4.8.2_msvc2010\mkspecs\win32-msvc2010" -FoBuild\Debug\Temp\ @C:\TEMP\moc_CWordEditor.obj.6868.7067.jom
moc_CWordEditor.cpp
    cl -c -nologo -Zm200 -Zc:wchar_t- -Zi -MDd -W3 -w34100 -w34189 -GR -EHsc -DUNICODE -DWIN32 -DQT_LARGEFILE_SUPPORT -DQT_DLL -DQT_SQL_LIB -DQT_XML_LIB -DQT_GUI_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -DQT_HAVE_MMX -DQT_HAVE_3DNOW -DQT_HAVE_SSE -DQT_HAVE_MMXEXT -DQT_HAVE_SSE2 -DQT_THREAD_SUPPORT -I"..\..\..\Libs\Qt\4.8.2_msvc2010\include\QtCore" -I"..\..\..\Libs\Qt\4.8.2_msvc2010\include\QtNetwork" -I"..\..\..\Libs\Qt\4.8.2_msvc2010\include\QtGui" -I"..\..\..\Libs\Qt\4.8.2_msvc2010\include\QtXml" -I"..\..\..\Libs\Qt\4.8.2_msvc2010\include\QtSql" -I"..\..\..\Libs\Qt\4.8.2_msvc2010\include" -I"..\..\xLib\Project\Include" -I"..\..\..\Libs\Qt\4.8.2_msvc2010\include\ActiveQt" -I"Build\Debug\Temp" -I"Build\Debug\Ui" -I"..\..\..\Libs\Qt\4.8.2_msvc2010\mkspecs\win32-msvc2010" -FoBuild\Debug\Temp\ @C:\TEMP\moc_CWordFinder.obj.6868.7114.jom
moc_CWordFinder.cpp
    link /LIBPATH:"d:\Libs\Qt\4.8.2_msvc2010\lib" /NOLOGO /DYNAMICBASE /NXCOMPAT /DEBUG /MANIFEST /MANIFESTFILE:"./Build/Debug/Temp\iTeacher.intermediate.manifest" /SUBSYSTEM:WINDOWS "/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" /OUT:Build\Debug\Distr\iTeacher.exe @C:\TEMP\iTeacher.exe.6868.9672.jom
CMain.obj : error LNK2019: unresolved external symbol "public: static void __cdecl NxLib::CxDir::vCreateForce(class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &)" (?vCreateForce@CxDir@NxLib@@SAXABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@Z) referenced in function "private: void __thiscall CMain::_initMain(void)" (?_initMain@CMain@@AAEXXZ)
CMain.obj : error LNK2019: unresolved external symbol "public: static class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > __cdecl NxLib::CxPath::sExeDir(void)" (?sExeDir@CxPath@NxLib@@SA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@XZ) referenced in function "private: void __thiscall CMain::_initMain(void)" (?_initMain@CMain@@AAEXXZ)
CMain.obj : error LNK2019: unresolved external symbol "public: static class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > __cdecl NxLib::CxString::sFormatPercentage(unsigned __int64 const &,unsigned __int64 const &)" (?sFormatPercentage@CxString@NxLib@@SA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@AB_K0@Z) referenced in function "private: void __thiscall CMain::slot_cboDictionaryPath_OnCurrentIndexChanged(class QString const &)" (?slot_cboDictionaryPath_OnCurrentIndexChanged@CMain@@AAEXABVQString@@@Z)
CMain.obj : error LNK2001: unresolved external symbol "public: static class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const NxLib::CxConst::xSLASH" (?xSLASH@CxConst@NxLib@@2V?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@B)
CMain.obj : error LNK2019: unresolved external symbol "public: static void __cdecl NxLib::CxDir::vFindFiles(class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &,class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &,bool const &,class std::vector<class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> >,class std::allocator<class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > > > *)" (?vFindFiles@CxDir@NxLib@@SAXABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@0AB_NPAV?$vector@V?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@V?$allocator@V?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@2@@4@@Z) referenced in function "private: void __thiscall CMain::cboDictionaryPath_reload(void)" (?cboDictionaryPath_reload@CMain@@AAEXXZ)
CMain.obj : error LNK2019: unresolved external symbol "public: static bool __cdecl NxLib::CxDir::bIsExists(class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &)" (?bIsExists@CxDir@NxLib@@SA_NABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@Z) referenced in function "private: void __thiscall CMain::cboDictionaryPath_reload(void)" (?cboDictionaryPath_reload@CMain@@AAEXXZ)
Build\Debug\Distr\iTeacher.exe : fatal error LNK1120: 6 unresolved externals
jom: D:\Projects\Qt\iTeacher\Makefile.Debug [Build\Debug\Distr\iTeacher.exe] Error 1120
jom: D:\Projects\Qt\iTeacher\Makefile [debug] Error 2
00:06:59: The process "D:\Soft\Coding\_C++\QtCreator\2.5.2\bin\jom.exe" exited with code 2.
Error while building/deploying project iTeacher (target: Desktop)
When executing step 'Make'


Ошибки:
Код

CMain.obj:-1: 
error: LNK2019: unresolved external symbol 
"public: static void __cdecl NxLib::CxDir::vCreateForce(class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > const &)"
 (?vCreateForce@CxDir@NxLib@@SAXABV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@@Z) 
referenced in function "private: void __thiscall CMain::_initMain(void)" (?_initMain@CMain@@AAEXXZ)

CMain.obj:-1: 
error: LNK2019: unresolved external symbol 
"public: static class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > __cdecl NxLib::CxPath::sExeDir(void)" 
(?sExeDir@CxPath@NxLib@@SA?AV?$basic_string@GU?$char_traits@G@std@@V?$allocator@G@2@@std@@XZ) 
referenced in function "private: void __thiscall CMain::_initMain(void)" (?_initMain@CMain@@AAEXXZ)

...


Т.е. не линкуються моя статическая либа, либу собирал с поддержкой юникода (Use Unicode Character Set).

Меня вот это смущает:
Код

... class std::basic_string<unsigned short,struct std::char_traits<unsigned short>,class std::allocator<unsigned short> > ...

Почему unsigned short, а не wchar_t ? 
Что-то нашел по-поводу "build-in type", но до конца не разобрался в чеm  дело.

Это сообщение отредактировал(а) Alca - 29.11.2012, 01:22


--------------------
PM WWW ICQ Skype Jabber   Вверх
586
Дата 29.11.2012, 06:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 2
Всего: 146



Цитата(Alca @  29.11.2012,  02:13 Найти цитируемый пост)
Почему unsigned short, а не wchar_t ? 
Что-то нашел по-поводу "build-in type", но до конца не разобрался в чеm  дело.

Эта опция должна совпадать в обоих проектах.

/Zc:wchar_t (wchar_t Is Native Type)
PM   Вверх
Alca
Дата 29.11.2012, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



Так при сборке статической либы использовал (VS 2010):
Цитата

Treat WChar_t As Built in Type - Yes (/Zc:wchar_t)


В makefile (QtCreator):
Цитата

...
CFLAGS        = -nologo -Zm200 -Zc:wchar_t- -Zi -MDd -W3 $(DEFINES)
CXXFLAGS      = -nologo -Zm200 -Zc:wchar_t- -Zi -MDd -W3 -w34100 -w34189 -GR -EHsc $(DEFINES)
...


Это сообщение отредактировал(а) Alca - 29.11.2012, 10:58


--------------------
PM WWW ICQ Skype Jabber   Вверх
586
Дата 29.11.2012, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 2
Всего: 146



Цитата(Alca @  29.11.2012,  11:56 Найти цитируемый пост)
Так при сборке статической либы использовал (VS 2010):
Цитата
Treat WChar_t As Built in Type - Yes (/Zc:wchar_t)

Здесь он включен.

Цитата(Alca @  29.11.2012,  11:56 Найти цитируемый пост)
В makefile (QtCreator):
Цитата
...
CFLAGS        = -nologo -Zm200 -Zc:wchar_t- -Zi -MDd -W3 $(DEFINES)
CXXFLAGS      = -nologo -Zm200 -Zc:wchar_t- -Zi -MDd -W3 -w34100 -w34189 -GR -EHsc $(DEFINES)
...

А вот здесь выключен.

Параметр "-Zc:wchar_t" включает опцию, а параметр "-Zc:wchar_t-" выключает.
PM   Вверх
Alca
Дата 29.11.2012, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



А Как его включить, не меняя мэйкфайлы?


--------------------
PM WWW ICQ Skype Jabber   Вверх
586
Дата 29.11.2012, 11:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 2
Всего: 146



Цитата(Alca @  29.11.2012,  12:13 Найти цитируемый пост)
А Как его включить, не меняя мэйкфайлы? 

Измени .pro файл.

Посмотри в хелпе как это делается. Точно не помню, примерно так:
Код
QMAKE_CXXFLAGS.CW -= -Zc:wchar_t-
QMAKE_CXXFLAGS.CW += -Zc:wchar_t

PM   Вверх
Alca
Дата 29.11.2012, 11:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



Так получилось:
Цитата

QMAKE_CXXFLAGS -= -Zc:wchar_t-
QMAKE_CXXFLAGS += -Zc:wchar_t
QMAKE_CFLAGS   -= -Zc:wchar_t-
QMAKE_CFLAGS   += -Zc:wchar_t


Теперь такое, что не так с QString::toStdWString??:
Код

CUtils.obj:-1: 
error: LNK2019: unresolved external symbol 
"__declspec(dllimport) public: class std::basic_string<wchar_t,struct std::char_traits<wchar_t>,class std::allocator<wchar_t> > 
__thiscall QString::toStdWString(void)const " (__imp_?toStdWString@QString@@QBE?AV?$basic_string@_WU?$char_traits@_W@std@@V?$allocator@_W@2@@std@@XZ) 
referenced in function "public: static void __cdecl CUtils::applicationActivate(class QString const &,class QString const &)" (?applicationActivate@CUtils@@SAXABVQString@@0@Z)



--------------------
PM WWW ICQ Skype Jabber   Вверх
586
Дата 29.11.2012, 11:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 2
Всего: 146



У тебя Qt скомпилирован без опции "-Zc:wchar_t". Проще в обоих проектах отключить эту опцию.
PM   Вверх
Alca
Дата 29.11.2012, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



Цитата

У тебя Qt скомпилирован без опции "-Zc:wchar_t". Проще в обоих проектах отключить эту опцию.

А как же юникод? Как это флаг повлияет на юникод?

Добавлено @ 11:41
http://developer.qt.nokia.com/wiki/toStdWS...AndBuiltInWchar
Цитата

QString, std::wstring and built-in wchar_t
Problem statement

Qt advises to build your Qt based software without wchar_t as built-in type, just like the Qt libraries themselves. In some cases this is not desired by the environment or not possible because other libraries have been built with the built-in wchar_t type. This will cause obscure linker errors when using std::wstrings, and QString::toStdWString() and QString::fromStdWString().
Possible solution

Windows uses utf-16 for its character encoding, as does Qt. Using this information we can use the following code to work around the issue:


Код

/*! Convert a QString to an std::wstring */

std::wstring qToStdWString(const QString &str)

{

#ifdef _MSC_VER

 return std::wstring((const wchar_t *)str.utf16());

#else

 return str.toStdWString();

#endif

}

 

/*! Convert an std::wstring to a QString */

QString stdWToQString(const std::wstring &str)

{

#ifdef _MSC_VER

 return QString::fromUtf16((const ushort *)str.c_str());

#else

 return QString::fromStdWString(str);

#endif

}



Note that for other platforms the std::wstring may be implemented using uint32 (for ucs-4/utf-32) instead.


Это сообщение отредактировал(а) Alca - 29.11.2012, 11:44


--------------------
PM WWW ICQ Skype Jabber   Вверх
586
Дата 29.11.2012, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 2
Всего: 146



Цитата(Alca @  29.11.2012,  12:40 Найти цитируемый пост)
А как же юникод? Как это флаг повлияет на юникод?

Этот флаг не влияет на Юникод. Он не влияет на работоспособность программы. Просто, при включенном флаге тип wchar_t - уникальный, а при выключенном флаге этот тип соответствует типу unsigned short.
PM   Вверх
Alca
Дата 29.11.2012, 12:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3993
Регистрация: 14.6.2006

Репутация: 2
Всего: 50



Спасибо


--------------------
PM WWW ICQ Skype Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0817 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.