Grigoriy |
Отправлено: 05.03.2007, 00:53 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
Может покажется вопрос тупым.
Мне впервые надо использовать статическое связывание DLL с моей программой.
Их хелпа вычитал, что нужно создать "*.lib"- файл программой implib.exe.
Создал такой файл. Добавил его в проект.
Описал ссылки на функции в модуле, например
CODE |
__declspec( dllimport ) void gltInitFrame(GLTFrame*);
__declspec( dllimport ) void gltTranslateFrameWorld(GLTFrame*,float,float,float);
__declspec( dllimport ) void gltRotateFrameLocalZ(GLTFrame*,float);
__declspec( dllimport ) void gltApplyCameraTransform(GLTFrame*);
|
Компилирую — компилируется нормально, линковщик выдает ошибку о том, что
[Linker Error] Unresolved external 'gltIsExtSupported(char *)' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\OPENGL_PROGECTS\ENGINEDEMO\ENGINE1.OBJ
[Linker Error] Unresolved external 'gltIsWGLExtSupported(void *, char *)' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\OPENGL_PROGECTS\ENGINEDEMO\ENGINE1.OBJ
[Linker Error] Unresolved external 'gltMakeShadowMatrix(float[3] *, float *, float *)' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\OPENGL_PROGECTS\ENGINEDEMO\ENGINE1.OBJ
[Linker Error] Unresolved external 'gltMoveFrameUp(GLTFrame *, float)' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\PROJECTS\OPENGL_PROGECTS\ENGINEDEMO\ENGINE1.OBJ
и так далее.
Что неправильно ? Озадачен и надеюсь что помогут.
|
|
AVC |
Отправлено: 05.03.2007, 09:04 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
А вы смотрели состав библиотеки. Такие глобальые символы действительно там есть и имеют именно такие имена? |
|
Grigoriy |
Отправлено: 06.03.2007, 22:54 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
DLL создал я сам. И создал я ее на ассемблере FASM.
Я прилагаю архив с файлами
DLL
LIB
и текстовым файлом начала модуля на C++ Builder 6.0.
Надеюсь, что мне объяснят еще чего нибудь.
|
|
AVC |
Отправлено: 07.03.2007, 13:45 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
CODE |
C++Builder allows your programs to easily call routines written in other languages, and vice versa. When you mix languages , you have to deal with two important issues: identifiers and parameter passing.
By default, C++Builder saves all global identifiers in their original case (lower, upper, or mixed) with an underscore "_" prepended to the front of the identifier. To remove the default, you can use the -u command-line option.
...
Modifier Push prm Pop prm Name change (only in C)
__cdecl (1) Right to left Caller '_' prepended
__fastcall Left to right Callee '@' prepended
__pascal Left to right Callee Uppercase
__stdcall Right to left Callee No change
1. This is the default.
|
У вас в библиотеке соблюдены соглашения для (__cdecl)? |
|
Grigoriy |
Отправлено: 07.03.2007, 14:51 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
Входные параметры каждой функции в библиотеке размещаются в стеке по правилу stdcall.
Экспортируемые имена такие же какие они в модуле, который использует эту библиотеку. Никаких символов подчеркивания нет. Вообще говоря, я пока не понимаю зачем они там нужны, объясните, пожалуйста.
|
|
AVC |
Отправлено: 07.03.2007, 15:10 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
Я привел выдержку из хелпа Buider'а о правилах именования, передачи и очистки по которым он умеет работать и ожидает, что внешнии модули будут придерживаться одного из этих правил.
Пример для __cdecl, глобальный символ ааа
- исходный код библиотеки на С — ааа()
- в библиотеке _aaa
- вызов из библиотеки в приложении ааа()
(__cdecl is the default)
|
|
Grigoriy |
Отправлено: 07.03.2007, 21:56 |
|
Мастер участка
Группа: Участник
Сообщений: 381
|
Я обнаружил, что исходный код библиотеки составлен некорректно.
Возможно это влияет на содержимое LIB-файла и на компиляцию.
Некоторые баги библиотеки исправил.
Попытаюсь динамически связаться с функциями для того чтобы протестировать библиотеку.
|
|