Добрый день. Моя проблемка 1.хотел получить библиотеку lib. 2.Написал на С++ 2-функции и сохранил их в файл *.cpp Код (Text): //----------MathLib.cpp---------------- #include <cmath> #include "MathLib.h" // Arithmetic functions int MLSquare (int iArg_) { return (iArg_ * iArg_); } int MLSquareroot (int iArg_) { return ((int)sqrt ((double)iArg_)); } float MLSquare (float fArg_) { return (fArg_ * fArg_); } 3. расписал файл *.h Код (Text): //-----------MathLib.h----------- #ifndef MATHLIB_H #define MATHLIB_H // Constants const float MLPI = 3.14159f; // Arithmetic functions int MLSquare (int iArg_); int MLSquareroot (int iArg_); float MLSquare (float fArg_); #endif 4.создал проект Win32 Static Library добавил *.cpp и *.h 5.все остальное по умолчанию 6.cобрал проект - получил lib 7.c помощью программы l2inc хотел получить файл *.inc в ответ надпись - Код (Text): D:\l2inc12>L2INCA.EXE /M MathLib.lib MathLib.lib Pass 1234 Library has no imports Если я подключаю в проекте VС++ *.cpp и *.h все работает, но как для поиспользовать эти ф-ции в asm - программах ?( который я стараюсь учить). Вопрос: Подскажите пожалуйста, что я не учел в этом *.cpp для того чтобы моя Library получила способность импортировать мои функции. Ну и чтобы получить *.inc из моей *.h или *.lib. Извините. Спасибо.
young_man Ты скармливаешь не ту либу!!! предназначена для либ, которые содержат импорт. А твоя лица - это обычная БД из объектных файлов. Ты создал проект создал проект Win32 Static Library добавил *.cpp и *.h а надо было DLL. Если сделаешь DLL всё получится. Если хочешь статик, пиши inc руками. Что касается импортирования функций в asm, смотри директиву export в С++ и ASM. Всё, что тебе надо - правильно указать имена экспортируемых процедур.
... не сочтите за назойливость, но подскажите еще раз как создать в VC ++ 6.0 либу содержащую импорты. Я переделывал свой случай так : Код (Text): //-----------MathLib.h----------- #ifndef MATHLIB_H #define MATHLIB_H // Constants const float MLPI = 3.14159f; // Arithmetic functions extern "C" __declspec(dllexport) int MLSquare (int iArg_); extern "C" __declspec(dllexport) int MLSquareroot (int iArg_); extern "C" __declspec(dllexport) float MLSquare (float fArg_); #endif ... однако привиредливая l2inc все равно не довольна и возвращает Код (Text): D:\l2inc12>L2INCA.EXE /M MathLib.lib MathLib.lib Pass 1234 [b]Library has no imports[/b] ... и в asm - программе эта lib естественно - а не подключается ( В инете - искал, такое впечатление, что никто никогда это не делает. В проектах сpp - без проблем. Спасибо.
Я делал несколько иначе: Саму либу компилировал и линковал батником с такими ключами: cl /c /Gz /LD /Ox cdll.cpp link /LIB cdll.obj /out:cdll.lib Это ключи для получения статической либы. Затем эту либу скормил L2INC: C:\masm32\tools\L2INC\L2INC.EXE cdll.lib и она выдала такой cdll.inc: ; =========================================== ; cdll.inc copyright MASM32 1998 - 2003 ; =========================================== BM PROTO WORD,WORD,WORD,WORD _BM PROTO WORD,WORD,WORD,WORD main PROTO WORD,WORD,WORD preBmBc PROTO WORD,WORD,WORD preBmGs PROTO WORD,WORD,WORD suffixes PROTO WORD,WORD,WORD P.S. это ключи для cl из vc 7.0, как там в 6.0 не знаю, но должно быть также
Ну почему, делает конечно. Даже главы есть по такому вопросу. Вы должны объвить внешними имена. Допустим С это делает по умолчанию для библиотеке. В Асме надо написать файл EXTERNDEF С MyFun:near !!! Вы должны помнить, что компиляторы искажают имя функции !!! (см. определение EXTERNDEF ) Это значит, что вы импортируйте функцию MyFun, коорая на самом деле называется _MyFun из библиотеки. С++ как правило извращает имен функций сильнее. Поэтому следует подсматривать в lib, как именно она их извратила (а там это есть).
В аттаче три файла, необходимые для получения .lib и .inc для использования в программе, написаной на асме. Укажи в .bat свои пути к папкам bin, include, lib и запусти его. Полученные .lib и .inc работают в асме, проверил. Из тела .cpp удалил все упоминания о float и double, а то асмовый линкер не находит то ли функции, то ли типы, которые с++ пихает в либу и возникает ошибка: : unresolved external symbol __fltused : unresolved external symbol __ftol Где искать эти __fltused и __ftol, чтобы указать линкеру - не знаю, поэтому сделал проще: заменил sqrt на асм-вставку. Из ассемблера вызываются ф-ции либы как обычно: Код (Text): include mathlib.inc includelib mathlib.lib .data float_value dd 3.5 float_result dq 0 .code invoke MLSquare,32 PrintDec eax ;eax = 1024 invoke MLSquareroot,eax PrintDec eax ;eax = 32 invoke MLSquareFloat,float_value push eax fld dword ptr[esp] fstp qword ptr[float_result] pop eax PrintDouble float_result ;1.870829 единственно нужно положить .lib и .inc к .asm. Если надо либу делать не батником, а из среды vc++ 6.0, то попробуй изменить в IDE параметры компилятора и линкера на такие же, как в .bat _247312667__MathLib.zip