· Начало · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ZEN —› Создание .lib для MASM & VC++

Посл.отвђт Сообщенiе


Дата: Янв 11, 2004 17:09:31 · Поправил: IceStudent
Правка

Вот проблема: имеется библиотека и к ней заголовочный файл (.h) + def-файл такого содержания:
IMPORTS
 xxxLib.xxxFunc1
 xxxLib.xxxFunc2


Как получить файл .lib для использования и в MASM, и в VC++?
Я попробовал просто:
lib.exe /DEF:xxx.def
Получился файл, 22Кб, но он не подходит ни MASM'y, ни VC.

Попробовал по статье с этого сайта, создать фэйковую (что бы это означало?) DLL и использовать её .lib-файл. Этот способ подходит только для MASM: внутри её функции объявлены как __imp__xxxFunc@4(1) и т.д. (8Кб), а VC++ требует __imp__xxxFunc@куча_разных_букв_и_цифр(2).

И наоборот, при создании фэйковой DLL под VC++ я получаю lib (9,5Кб), не совместимую с MASM.

Вопрос:
1)Как сделать стандартную lib, совместимую и с тем, и с другим компилятором?
2)Почему генерируются разные lib, ведь компоновщик-то (LINK.exe) один: и для МАSМ'a, и для VC?
3)Как скормить компилятору VC++ lib-файл с функциями вида (1)?

Я не знаю формат файлов .lib, но где-то описывался формат функций (2). У Рихтера?

4)Где можно узнать подробную информацию касательно lib-файлов, чтобы разобраться с этим раз и навсегда?

Заранее благодарен.

P.S.
IMPORTS уже не поддерживается, как сообщил мне компоновщик из VS 7.0.


Дата: Янв 11, 2004 17:25:47

IceStudent
Поиск по форуму касательно первого пункта.

ЗЫ: Может EXPORTS, вместо IMPORTS?


Дата: Янв 11, 2004 17:51:19 · Поправил: Grenader

Я попробовал просто:
lib.exe /DEF:xxx.def
Получился файл, 22Кб, но он не подходит ни MASM'y, ни VC

что значит "не подходит" ? у тебя на выходе должен получиться нормальный LIB мелкософтского формата. В DEF действительно нужно использовать EXPORTS. Я сам так делал, когда нужно было. Все работает. Другое дело, что с декорированием имен будут проблемы (вместо __imp_xxx и прочего барахла - нормальные имена) Выход - при описании функций в проге указывать язык "C". пример для MASM:
ExitProcess	proto C :dword


Дата: Янв 11, 2004 21:16:22

Попробовал по статье с этого сайта, создать фэйковую (что бы это означало?) DLL и использовать её .lib-файл.
Фэйковая - от слова fake подложный, подделка, подделывать.


Дата: Янв 12, 2004 16:29:45

IceStudent
Как получить файл .lib для использования и в MASM, и в VC++?

Оформляй все функции по STDCALL
Чтобы вызвать STDCALL в MASM нужно

EXTERNDEF __imp__ИмяФункции@0:dword

Есть и другие методы, смотри как я делал интерфейсы к Win32

WASM.RU/TOOLS/HI-TECH


Дата: Янв 18, 2004 19:23:55
Правка

Quantum
Может EXPORTS, вместо IMPORTS?
Если ты о директиве в файле .def, то я правильно написал. В P.S. тоже…

Grenader
что значит "не подходит" ?
Компиляторы (и ml.exe, и cl.exe) сообщают об ошибках.
Подробнее пока не могу сообщить…

Edmond
Оформлять при создании подложной библиотеки?

Есть и другие методы
А где именно посмотреть Ваши работы?


Дата: Янв 18, 2004 22:35:32

IceStudent
Если ты о директиве в файле .def, то я правильно написал.
Не спорю, но это был намёк ;-)

Объясняю более подробно.

1. Модифицируем DEF-файл следующим образом:
LIBRARY имя_библиотеки
EXPORTS
xxxFunc1
xxxFunc2

2. Пишем программу для фэйковой DLL:
.386
.model flat, stdcall
option casemap :none

EXPORT MACRO symbol:REQ
_&symbol& PROC SYSCALL
_&symbol& ENDP
ENDM

.code
lib PROC p1:DWORD,p2:DWORD,p3:DWORD
lib ENDP

EXPORT xxxFunc1@X ; X - это кол-во параметров x4
EXPORT xxxFunc2@X ;     (почти всегда :-)

end lib

3. Компилим всё это вместе с DEF-файлом и получаем фэйковую DLL (её можно сразу удалить) и нормальный LIB.

4. Для использования в масме пишем INC по принципу изложенному Edmond'ом.

5. Для использования в VC, немного корректируем .h чтоб после @ линкер не требовал "куча_разных_букв_и_цифр". Для этого есть директива, которая уже приводилась в форуме (об этом пишет Dr. Golova)


Дата: Янв 18, 2004 22:48:39
Правка

Quantum
Угу, я так и сделал. Проблема была в "замангливании" имён by VC++. Спасибо за ссылку, теперь и она решится.