crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> искажения имён функций в LIB-файлах, и как с ними жить.
Litkevich Yuriy
  опции профиля:
сообщение 30.12.2010, 22:20
Сообщение #1


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Возникла проблема с линковкой чужой dll-ки (точнее lib-файла) к своему приложению написанному на Qt/MinGW32.

получаю сообщения об ошибке:
tmp/debug/mainwindow.o: In function `ZN10Mainwindow5startEv':
L:/Repository/EDATools/P-CAD_interface/DBXSamp4Port2Qt4/src/mainwindow.cpp:33: undefined reference to `_Z11TOpenDesignllPKcP10DbxContext@16'
L:/Repository/EDATools/P-CAD_interface/DBXSamp4Port2Qt4/src/mainwindow.cpp:45: undefined reference to `_Z12TGetFirstNetP10DbxContextP4TNet@8'
L:/Repository/EDATools/P-CAD_interface/DBXSamp4Port2Qt4/src/mainwindow.cpp:50: undefined reference to `_Z11TGetNextNetP10DbxContextP4TNet@8'
L:/Repository/EDATools/P-CAD_interface/DBXSamp4Port2Qt4/src/mainwindow.cpp:59: undefined reference to `_Z12TCloseDesignP10DbxContextPKc@8'
tmp/debug/mainwindow.o: In function `ZN10Mainwindow4exitEv':
L:/Repository/EDATools/P-CAD_interface/DBXSamp4Port2Qt4/src/mainwindow.cpp:68: undefined reference to `_Z12TCloseDesignP10DbxContextPKc@8'
collect2: ld returned 1 exit status
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


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Не помогло. теперь вывод такой:
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc -Wl,-s -mthreads -Wl -Wl,-subsystem,windows -o dbxsamp4qt.exe tmp/release/mainwindow.o tmp/release/main.o tmp/release/moc_mainwindow.o  -L"h:\Qt\4.5.3_std\lib" -lmingw32 -lqtmain L:/Repository/EDATools/P-CAD_interface/DBXSamp4Port2Qt4/src/../Common/Dbx32.a -lQtGui4 -lQtCore4
tmp/release/mainwindow.o:mainwindow.cpp:(.text+0x2fa): undefined reference to `_Z12TCloseDesignP10DbxContextPKc@8'
tmp/release/mainwindow.o:mainwindow.cpp:(.text+0x4a3): undefined reference to `_Z11TOpenDesignllPKcP10DbxContext@16'
tmp/release/mainwindow.o:mainwindow.cpp:(.text+0x61d): undefined reference to `_Z12TGetFirstNetP10DbxContextP4TNet@8'
tmp/release/mainwindow.o:mainwindow.cpp:(.text+0x6ef): undefined reference to `_Z11TGetNextNetP10DbxContextP4TNet@8'
tmp/release/mainwindow.o:mainwindow.cpp:(.text+0xa44): undefined reference to `_Z12TCloseDesignP10DbxContextPKc@8'
collect2: ld returned 1 exit status


Делал так:
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":
extern "C" {
void __stdcall foo();
void __stdcall bar();
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 31.12.2010, 16:36
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


DEADHUNT, Хм-м-м.
Сделал так:
extern "C" {
#include "dbx32.h"
}
чтобы не изменять чужой файл. Получил другую ругань:
l:/Repository/EDATools/P-CAD_interface/DBXSamp4Port2Qt4/tmp/debug/mainwindow.o: In function `ZN10Mainwindow5startEv':
l:/Repository/EDATools/P-CAD_interface/DBXSamp4Port2Qt4/src/mainwindow.cpp:33: undefined reference to `TOpenDesign@16'
l:/Repository/EDATools/P-CAD_interface/DBXSamp4Port2Qt4/src/mainwindow.cpp:45: undefined reference to `TGetFirstNet@8'
l:/Repository/EDATools/P-CAD_interface/DBXSamp4Port2Qt4/src/mainwindow.cpp:50: undefined reference to `TGetNextNet@8'
l:/Repository/EDATools/P-CAD_interface/DBXSamp4Port2Qt4/src/mainwindow.cpp:59: undefined reference to `TCloseDesign@8'
l:/Repository/EDATools/P-CAD_interface/DBXSamp4Port2Qt4/tmp/debug/mainwindow.o: In function `ZN10Mainwindow4exitEv':
l:/Repository/EDATools/P-CAD_interface/DBXSamp4Port2Qt4/src/mainwindow.cpp:68: undefined reference to `TCloseDesign@8'
collect2: ld returned 1 exit status
(использовал оригинальный lib-файл).

Интересно, что в первом и последнем случае, указаны строки в файле mainwindow.cpp, где осуществляется вызов функций из библиотеки. А во втором случае - нет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Iron Bug
  опции профиля:
сообщение 1.1.2011, 15:42
Сообщение #6


Профессионал
*****

Группа: Модератор
Сообщений: 1593
Регистрация: 6.2.2009
Из: Yekaterinburg
Пользователь №: 533

Спасибо сказали: 218 раз(а)




Репутация:   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


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 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  


Цитата(Litkevich Yuriy @ 1.1.2011, 17:14) *
я пока врукопашную разрешаю имена функций. Времени съедает прилично.
А 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


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Danila_Bagrofff @ 11.7.2011, 16:03) *
А как это врукопашную?
с помощью QLibrary загружаю, фрагмент:
Design::Design(DesignType atype)
        :dbxLib("Dbx32")
        ,type(atype)
{
    Q_ASSERT_X(dbxLib.load(),
               "Design::Design(DesignType type)",
               "Dbx32 unable to load");
...
}

Net Design::firstNet()
{
    typedef long DLLX (*TGetFirstNet)(DbxContext* pContext,
                                      TNet* pNet);
    TGetFirstNet getFirstNet;
    getFirstNet = (TGetFirstNet)dbxLib.resolve("TGetFirstNet");

    Q_ASSERT_X(getFirstNet,
               "Design::nets()",
               "Unable to resolve \"TGetFirstNet\"");
    
    TNet dbxNet;
    dbxStatus = getFirstNet(&dbxContext, &dbxNet );

    Net net(new NetPrivate(dbxNet));
    return net;
}
где 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
#define DLLX __stdcall


with
#define DLLX __cdecl


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 вроде как пропала. Но не получается заюзать функцию.

Пытаюсь теперь заюзать в кути:
DbxContext tContext;
    if(TOpenDesign(DBX_LANGUAGE, DBX_VERSION, "sch", &tContext)==DBX_OK)
    {
        emit(addLog(tr("!!!!!")));
    }
    return true;


Но выдается ошибка:

Цитата
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 (цель: Настольный компьютер)
Во время выполнения сборки на этапе "Сборка"


Подскажите, где я теперь косяк?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 15.11.2019, 2:49