| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets > Qt + TCHAR = unresolve external |
| Автор: null56 20.10.2010, 13:44 | ||||||
| Всем привет Проекты Qt собираются под студией Проблема: Есть либа (static lib), из которой черпаются классы с методами. Все линкуется кроме методов, аргументы которых имеют тип TCHAR или аналогичные макросы винды Линковщик выводит следующее
хотя прототип функции имеет вид
я так понял, что проблема как раз в этих макросах, Qt почему - то считает, что это не wchar_t Вопросы: - как решить эту проблему? - и реально ли вообще это сделать без пересборки либы? заранее благодарен за помощь ЗЫ: при компиляции в проекте присутствуют
|
| Автор: borisbn 20.10.2010, 13:50 | ||
| скорее всего эта твоя либа (static lib) скомпилирована без поддержки UNICODE, а Qt - с ней. Несмотря на то, что в прототипе указано
в самой lib-ине код - неюникодовский. решение видится такое: 1-й вариант: для h-ника с описанием прототипа отключить UNICODE 2-й вариант: скомпилировать lib-ину с поддержкой UNICODE 3-й вариант: уйти от этих типов TSTR и указывать явно char * или wchar_t * для 2-го и 3-го вариантов нужно перекомпилировать библиотеку. |
| Автор: null56 20.10.2010, 13:51 |
| ща проверю Добавлено @ 13:53 вы были правы... я бы долго сидел думал... спасибо вам Ответ: в либе отсутсвовали макросы UNICODE, видимо кто - то их забыл выставить или нарочно убрал ) |
| Автор: null56 20.10.2010, 15:19 |
| поторопился я радоваться http://ipicture.ru/uploads/101020/VsmT4LDr4E.png либа тоже юникодовая судя по всему ошибки не изчезли... Добавлено @ 15:21 перекомпилировать либу можно, только вопрос как, чтобы таких косяков не было |
| Автор: null56 20.10.2010, 15:58 |
| я только что заменил в классе типы аргументов на wchar_t, ошибка не прошла |
| Автор: 586 20.10.2010, 16:16 |
| null56, попробуй поменять настройку в проекте: Project Properties -> Configuration Properties -> C/C++ -> Language -> Treat wchar_t as Built-in Type. |
| Автор: null56 20.10.2010, 16:22 | ||||
| вот как раз только что сделал это в режим Yes получил
Добавлено через 11 минут и 23 секунды с этой опцией, я так понял, нельзя теперь пользоваться методом?
|
| Автор: 586 20.10.2010, 16:33 |
| Попробуй теперь отключить эту опцию, и в проекте, вместо wchar_t используй unsigned short. Если не будет компилироваться, то просто short. Добавлено Хотя нет. то не поможет. Без этой опции, wchar_t равен unsigned short. |
| Автор: null56 20.10.2010, 16:44 |
| завелось, но либы в таком виде оставлять не могу ( чего предолжите еще? |
| Автор: borisbn 20.10.2010, 16:46 |
| как ? |
| Автор: null56 20.10.2010, 16:48 | ||||
| изменил типы параметров в методах либы было
стало
|
| Автор: 586 20.10.2010, 17:20 | ||||||
А "Treat wchar_t as Built-in Type" включён? |
| Автор: borisbn 20.10.2010, 17:28 | ||||||
Ещё один момент. std::wstring ( возвращается toStdWString ), откомпилированный в библиотеках Qt, и std::wstring, откомпилированный в твоём проекте, совпадают только по интерфейсу. гарантии, что они будут полностью совпадать по реализации - нет. Т.о. см. след. код с комментариями:
P.S. Всё это не относится к тому случаю, если ты собирал библиотеки Qt у себя своим компилятором со своим SDK, а только, если установил библиотеки с сайта. |
| Автор: null56 20.10.2010, 17:34 | ||
No(/Zc:wchar_t-)
я ставил собранные библиотеки с сайта |
| Автор: 586 20.10.2010, 18:04 | ||
Если он выключен, то wchar_t равен unsigned short TCHAR равен unsigned short (при директиве UNICODE) LPCTSTR равен const unsigned short* (при директиве UNICODE) и следовательно, можно так написать:
и ошибок по идее быть не должно. плоховато. |
| Автор: null56 20.10.2010, 21:21 |
| выключен в проекте Qt, включен в либе... и как мне поступить? либой не только из Qt проектов пользуются. |
| Автор: null56 20.10.2010, 21:45 | ||
вообще в проекте я не использую ни одной строки из stl, все QString, есть только некоторые функции из библиотек, которым необходим указатель на начало строки, вот там как раз и задействуется, что - то типа этого
не думаю, что здесь есть какие моменты для конфликтов реализаций |
| Автор: borisbn 20.10.2010, 22:33 | ||
не уверен, тем более, что а вместо этого лучше юзать
я почему упорствую - уже сталкивался с подобной проблемой. Там была разница даже не в версии SDK, а в Multithread/Singlethread-версиях CRT. Резюме ( я для себя вывел такое правило ): собираешь библиотеки сам или компилируешь все исходники - используй какие хочешь классы, типы и т.п. хочешь, чтобы твои ( или Qt-шные ) программные модули использовались как бинарники - используй в интерфейсах только стандартные ( POD ) типы - const char *, int, bool и т.п. P.S. А если ты завтра установишь SP на студию, который изменит твой std::xxx ? |