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

 Здравствуйте, гость ( Вход | Регистрация )   Скачать форум | Поиск по Форуму | Участники | Помощь
 Поиск по:   сайтy   
   архиву форума   
  ОтветитьНовая темаНовый опрос
Использование DLL., Статическое связывание
« предыдущая тема | следующая тема » Подписаться на тему | Отправить тему на E-mail | Распечатать тему
Grigoriy
Отправлено: 05.03.2007, 00:53 Цитировать


Мастер участка


Группа: Участник
Сообщений: 381
Пользователь № 1342
Регистрация: 14.10.05



Может покажется вопрос тупым.
Мне впервые надо использовать статическое связывание 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

и так далее.
Что неправильно ? Озадачен и надеюсь что помогут.

--------------------
Материя - это просто неэвклидова дисторсия нашего пространства
 
Послать сообщение E-mail адрес  Top
AVC
Отправлено: 05.03.2007, 09:04 Цитировать


Ветеран


Группа: Модератор
Сообщений: 1583
Пользователь № 655
Регистрация: 19.05.04



А вы смотрели состав библиотеки. Такие глобальые символы действительно там есть и имеют именно такие имена?
 
Послать сообщение E-mail адрес ICQ  Top
Grigoriy
Отправлено: 06.03.2007, 22:54 Цитировать


Мастер участка


Группа: Участник
Сообщений: 381
Пользователь № 1342
Регистрация: 14.10.05



DLL создал я сам. И создал я ее на ассемблере FASM.
Я прилагаю архив с файлами
DLL
LIB
и текстовым файлом начала модуля на C++ Builder 6.0.

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

User Attached Image Скачать файл
GLTools.zip ( Количество загрузок: 655 )




--------------------
Материя - это просто неэвклидова дисторсия нашего пространства
 
Послать сообщение E-mail адрес  Top
AVC
Отправлено: 07.03.2007, 13:45 Цитировать


Ветеран


Группа: Модератор
Сообщений: 1583
Пользователь № 655
Регистрация: 19.05.04



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)?
 
Послать сообщение E-mail адрес ICQ  Top
Grigoriy
Отправлено: 07.03.2007, 14:51 Цитировать


Мастер участка


Группа: Участник
Сообщений: 381
Пользователь № 1342
Регистрация: 14.10.05



Входные параметры каждой функции в библиотеке размещаются в стеке по правилу stdcall.
Экспортируемые имена такие же какие они в модуле, который использует эту библиотеку. Никаких символов подчеркивания нет. Вообще говоря, я пока не понимаю зачем они там нужны, объясните, пожалуйста.

--------------------
Материя - это просто неэвклидова дисторсия нашего пространства
 
Послать сообщение E-mail адрес  Top
AVC
Отправлено: 07.03.2007, 15:10 Цитировать


Ветеран


Группа: Модератор
Сообщений: 1583
Пользователь № 655
Регистрация: 19.05.04



Я привел выдержку из хелпа Buider'а о правилах именования, передачи и очистки по которым он умеет работать и ожидает, что внешнии модули будут придерживаться одного из этих правил.

Пример для __cdecl, глобальный символ ааа
- исходный код библиотеки на С - ааа()
- в библиотеке _aaa
- вызов из библиотеки в приложении ааа()

(__cdecl is the default)
 
Послать сообщение E-mail адрес ICQ  Top
Grigoriy
Отправлено: 07.03.2007, 21:56 Цитировать


Мастер участка


Группа: Участник
Сообщений: 381
Пользователь № 1342
Регистрация: 14.10.05



Я обнаружил, что исходный код библиотеки составлен некорректно.
Возможно это влияет на содержимое LIB-файла и на компиляцию.
Некоторые баги библиотеки исправил.
Попытаюсь динамически связаться с функциями для того чтобы протестировать библиотеку.

--------------------
Материя - это просто неэвклидова дисторсия нашего пространства
 
Послать сообщение E-mail адрес  Top
6 ответов с: 05.03.2007, 00:53 Подписаться на тему | Отправить тему на E-mail | Распечатать тему

Back to Вопросы программирования в C++Builder
ОтветитьНовая темаНовый опрос