Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Qt + TCHAR = unresolve external, не находит функцию почему - то 
:(
    Опции темы
null56
Дата 20.10.2010, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Всем привет
Проекты Qt собираются под студией
Проблема:
Есть либа (static lib), из которой черпаются классы с методами. Все линкуется кроме методов, аргументы которых имеют тип TCHAR или аналогичные макросы винды
Линковщик выводит следующее
Код

unresolved external symbol "public: bool __thiscall filesystem::FileReader::open(unsigned short const  *,unsigned long,unsigned long,unsigned long)"

хотя прототип функции имеет вид
Код

bool open(LPCTSTR lpFileName, ...

я так понял, что проблема как раз в этих макросах, Qt почему - то считает, что это не wchar_t

Вопросы:
- как решить эту проблему?
- и реально ли вообще это сделать без пересборки либы?

заранее благодарен за помощь

ЗЫ: при компиляции в проекте присутствуют
Код

_UNICODE,UNICODE,WIN32,QT_LARGEFILE_SUPPORT;QT_THREAD_SUPPORT;QT_CORE_LIB;QT_GUI_LIB;QT_SQL_LIB

PM MAIL   Вверх
borisbn
Дата 20.10.2010, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 48
Всего: 135



скорее всего эта твоя либа (static lib) скомпилирована без поддержки UNICODE, а Qt - с ней.
Несмотря на то, что в прототипе указано
Цитата

open(LPCTSTR lpFileName, ...

в самой lib-ине код - неюникодовский.
решение видится такое:
1-й вариант: для h-ника с описанием прототипа отключить UNICODE
2-й вариант: скомпилировать lib-ину с поддержкой UNICODE
3-й вариант: уйти от этих типов TSTR и указывать явно char * или wchar_t *

для 2-го и 3-го вариантов нужно перекомпилировать библиотеку.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
null56
Дата 20.10.2010, 13:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



ща проверю

Добавлено @ 13:53
вы были правы... я бы долго сидел думал... спасибо вам

Ответ:  в либе отсутсвовали макросы UNICODE, видимо кто - то их забыл выставить или нарочно убрал )

Это сообщение отредактировал(а) null56 - 20.10.2010, 13:55
PM MAIL   Вверх
null56
Дата 20.10.2010, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



поторопился я радоваться
http://ipicture.ru/uploads/101020/VsmT4LDr4E.png
либа тоже юникодовая судя по всему
ошибки не изчезли...

Добавлено @ 15:21
перекомпилировать либу можно, только вопрос как, чтобы таких косяков не было



Это сообщение отредактировал(а) null56 - 20.10.2010, 15:27
PM MAIL   Вверх
borisbn
Дата 20.10.2010, 15:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 48
Всего: 135



Цитата(null56 @  20.10.2010,  15:19 Найти цитируемый пост)
перекомпилировать либу можно, только вопрос как, чтобы таких косяков не было


Цитата(borisbn @  20.10.2010,  13:50 Найти цитируемый пост)
3-й вариант: уйти от этих типов TSTR и указывать явно char * или wchar_t *


и вообще в интерфейс lib-ины и dll-ки ( т.е. бинарника ) лучше не выносить нестандартные типы, потому, что эти типы у тебя и у пользователя этой либины могут отличаться в зависимости от настроек компилятора, версии SDK и т.п. Это  же относится и к std::xxx


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
null56
Дата 20.10.2010, 15:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



я только что заменил в классе типы аргументов на wchar_t, ошибка не прошла
PM MAIL   Вверх
586
Дата 20.10.2010, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



null56,  попробуй поменять настройку в проекте: Project Properties -> Configuration Properties -> C/C++ -> Language -> Treat wchar_t as Built-in Type.

Это сообщение отредактировал(а) 586 - 20.10.2010, 16:17
PM   Вверх
null56
Дата 20.10.2010, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



вот как раз только что сделал это в режим Yes
получил 
Цитата

LINK : warning LNK4098: defaultlib 'LIBCMTD' conflicts with use of other libs; use /NODEFAULTLIB:library
admin_offline.obj : 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 "protected: void __thiscall admin_offline::AdminOffline::choose_key_file(void)" (?choose_key_file@AdminOffline@admin_offline@@IAEXXZ)
create_task_dialog.obj : error LNK2001: 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)
result_widget.obj : error LNK2001: 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)


Добавлено через 11 минут и 23 секунды
с этой опцией, я так понял, нельзя теперь пользоваться методом?
Код

toStdWString


Это сообщение отредактировал(а) null56 - 20.10.2010, 16:22
PM MAIL   Вверх
586
Дата 20.10.2010, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Попробуй теперь отключить эту опцию, и в проекте, вместо wchar_t используй unsigned short. Если не будет компилироваться, то просто short.

Добавлено
Хотя нет. то не поможет. Без этой опции, wchar_t равен unsigned short.

Это сообщение отредактировал(а) 586 - 20.10.2010, 16:43
PM   Вверх
null56
Дата 20.10.2010, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



завелось, но либы в таком виде оставлять не могу ( чего предолжите еще?
PM MAIL   Вверх
borisbn
Дата 20.10.2010, 16:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 48
Всего: 135



Цитата(null56 @  20.10.2010,  16:44 Найти цитируемый пост)
завелось
 как ?



--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
null56
Дата 20.10.2010, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



изменил типы параметров в методах либы
было
Код

openr(TCHAR * keyFile)

стало
Код

openr(unsigned short * keyFile)


PM MAIL   Вверх
586
Дата 20.10.2010, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(null56 @  20.10.2010,  17:48 Найти цитируемый пост)
изменил типы параметров в методах либы
было
Код
openr(TCHAR * keyFile)


стало
Код
openr(unsigned short * keyFile)

А "Treat wchar_t as Built-in Type" включён?
PM   Вверх
borisbn
Дата 20.10.2010, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 48
Всего: 135



Ещё один момент. std::wstring ( возвращается toStdWString ), откомпилированный в библиотеках Qt, и std::wstring, откомпилированный в твоём проекте, совпадают только по интерфейсу. гарантии, что они будут полностью совпадать по реализации - нет. Т.о. см. след. код с комментариями:
Код

// пример класса std::wstring, компилируемого в библиотеке Qt
class std::wstring ...
public:
  std::wstring & std::wstring( const std::wstring & other ) {
// копирование данных из other в *this
  }
  void foo2();
protected:
  unsigned short * m_data;
  size_t m_dataLen;
}


Код

// пример класса std::wstring, компилируемого в твоей программе
class std::wstring ...
public:
  std::wstring & std::wstring( const std::wstring & other ) {
// копирование данных из other в *this
  }
  void foo2();
protected:
  unsigned short * m_data;
}


Код

// твой код
QString str;
std::wstring w = str.toStdWString(); // как ты думаешь, что здесь произойтёт ?


P.S. Всё это не относится к тому случаю, если ты собирал библиотеки Qt у себя своим компилятором со своим SDK, а только, если установил библиотеки с сайта.


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
null56
Дата 20.10.2010, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 721
Регистрация: 19.3.2008

Репутация: 6
Всего: 12



Цитата(586 @  20.10.2010,  17:20 Найти цитируемый пост)
А "Treat wchar_t as Built-in Type" включён? 

No(/Zc:wchar_t-)

Цитата(borisbn @  20.10.2010,  17:28 Найти цитируемый пост)

P.S. Всё это не относится к тому случаю, если ты собирал библиотеки Qt у себя своим компилятором со своим SDK, а только, если установил библиотеки с сайта. 

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

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

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


 




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


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

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