C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Использование DLL., Статическое связывание
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.

Надеюсь, что мне объяснят еще чего нибудь.

User Attached Image Скачать файл
GLTools.zip


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

Вернуться в Вопросы программирования в C++Builder