искажения имён функций в LIB-файлах, и как с ними жить. |
Здравствуйте, гость ( Вход | Регистрация )
искажения имён функций в LIB-файлах, и как с ними жить. |
Litkevich Yuriy |
30.12.2010, 22:20
Сообщение
#1
|
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Возникла проблема с линковкой чужой dll-ки (точнее lib-файла) к своему приложению написанному на Qt/MinGW32.
получаю сообщения об ошибке: MinGW пытается искать искажённые имена. А Dll-ка выглядит так:DLL-ка создана студийным компиллером, неизвестной версии. Бибилотека, как указано в её описании, пригодна для компиляции как Си так и Си++ компиляторами, без привязки к конкретному производителю компилятора. Однако, в случае с плагином Qt, для поддержки СУБД Firebird, такой проблемы нет. Хотя тамошние lib и dll тоже студийные и тоже не имеют искажений имён. В чём может быть проблема? |
|
|
||
igor_bogomolov |
31.12.2010, 0:57
Сообщение
#2
|
Профессионал Группа: Сомодератор Сообщений: 1215 Регистрация: 22.3.2009 Из: Саратов Пользователь №: 630 Спасибо сказали: 235 раз(а) Репутация: 29 |
В чём может быть проблема не знаю, просто в качестве варианта, может попробовать этот lib файл через reimp/dlltool прогнать? По аналогии с тем, как когда то плагин для mysql собирали.
|
|
|
Litkevich Yuriy |
31.12.2010, 11:53
Сообщение
#3
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Не помогло. теперь вывод такой:
Делал так: reimp -d Dbx32.lib получил def-файл dlltool --dllname Dbx32.dll --def Dbx32.def --output-lib Dbx32.a -k получил a-файл. (пробовал и без ключа -k) |
|
|
DEADHUNT |
31.12.2010, 15:28
Сообщение
#4
|
Активный участник Группа: Участник Сообщений: 430 Регистрация: 15.4.2009 Пользователь №: 686 Спасибо сказали: 26 раз(а) Репутация: 2 |
h файл посмотри, может он для C предназначен, добавь extern "C":
|
|
|
Litkevich Yuriy |
31.12.2010, 16:36
Сообщение
#5
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
DEADHUNT, Хм-м-м.
Сделал так: чтобы не изменять чужой файл. Получил другую ругань: (использовал оригинальный lib-файл).Интересно, что в первом и последнем случае, указаны строки в файле mainwindow.cpp, где осуществляется вызов функций из библиотеки. А во втором случае - нет. |
|
|
Iron Bug |
1.1.2011, 15:42
Сообщение
#6
|
Профессионал Группа: Модератор Сообщений: 1611 Регистрация: 6.2.2009 Из: Yekaterinburg Пользователь №: 533 Спасибо сказали: 219 раз(а) Репутация: 12 |
это называется декорирование имён (decoration) либо mangling (по-русски я даже хз, как это обозвать). у мелкософта свой метод кодирования этих имён, отличный от большинства других компиляторов, ещё и разный от версии к версии. например, вот тут можно почитать про это: http://en.wikipedia.org/wiki/Name_mangling
обычно, если предполагается работа с другими компиляторами, делают сишный экспорт. т.е. чтобы имена не декорировались и соглашение и порядке переменных в стеке было соблюдено. reimp работает только с новым стандартом "коротких имён", как я понимаю. до студии 2003 включительно - старый формат. после - новый (вроде так). reimp может и не сожрать старые библиотеки. есть статья на эту тему http://msdn.microsoft.com/en-us/library/ty...v=vs.80%29.aspx, но это относится к мелкософтовскому компилеру, я хз, можно ли это прикрутить к mingw. может, тоже есть какие-то тулзы для этой цели, для генерации экспорта. скорее всего есть. если хочешь ковыряться - читай статью в вики и пробуй искать преобразователи форматов. Сообщение отредактировал Iron Bug - 1.1.2011, 15:42 |
|
|
Litkevich Yuriy |
1.1.2011, 16:14
Сообщение
#7
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
я пока врукопашную разрешаю имена функций. Времени съедает прилично.
А dll-как старая, в примерах, в файле проекта написано: Раскрывающийся текст # Microsoft Developer Studio Project File - Name="Dbxsamp4" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 ... |
|
|
Danila_Bagrofff |
11.7.2011, 13:03
Сообщение
#8
|
Студент Группа: Новичок Сообщений: 14 Регистрация: 16.4.2009 Из: Нижний Новгород Пользователь №: 690 Спасибо сказали: 0 раз(а) Репутация: 0 |
я пока врукопашную разрешаю имена функций. Времени съедает прилично. А dll-как старая, в примерах, в файле проекта написано: Раскрывающийся текст # Microsoft Developer Studio Project File - Name="Dbxsamp4" - Package Owner=<4> # Microsoft Developer Studio Generated Build File, Format Version 6.00 # ** DO NOT EDIT ** # TARGTYPE "Win32 (x86) Application" 0x0101 ... А как это врукопашную? Получилось как-то победить?.. подскажите? Тоже столкнулся с аналогичной проблемой реимп не помог, как и вам.. а очень надо... ПС. написал вам в аську. Если сможете, ответьте и там =) |
|
|
Litkevich Yuriy |
11.7.2011, 13:15
Сообщение
#9
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
А как это врукопашную? с помощью QLibrary загружаю, фрагмент: где dbxLib экземпляр QLibrary
|
|
|
Danila_Bagrofff |
11.7.2011, 13:28
Сообщение
#10
|
Студент Группа: Новичок Сообщений: 14 Регистрация: 16.4.2009 Из: Нижний Новгород Пользователь №: 690 Спасибо сказали: 0 раз(а) Репутация: 0 |
Нашел интересную инфу:
http://forums.codeblocks.org/index.php?PHP...g62081#msg62081 В особенности: Цитата I've replace
with
in DBx32.h and now I get a beautiful Цитата Process terminated with status 0 (0 minutes, 26 seconds) 0 errors, 0 warnings Это в файле dbx32.h подменили. так проблема с @16 вроде как пропала. Но не получается заюзать функцию. Пытаюсь теперь заюзать в кути:
Но выдается ошибка: Цитата mingw32-make: Leaving directory `D:/Program/LoodsmanContext' debug/DialogPE3.o:D:\Program\LoodsmanContext/DialogPE3.cpp:262: undefined reference to `TOpenDesign(long, long, char const*, DbxContext*)' collect2: ld returned 1 exit status mingw32-make[1]: *** [debug\LoodsmanContext.exe] Error 1 mingw32-make: *** [debug] Error 2 Процесс "D:/Qt/2010.05/mingw/bin/mingw32-make.exe" завершился с кодом %2. Возникла ошибка при сборке проекта LoodsmanContext (цель: Настольный компьютер) Во время выполнения сборки на этапе "Сборка" Подскажите, где я теперь косяк? |
|
|
Текстовая версия | Сейчас: 28.3.2024, 17:18 |