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