Как получают *.inc из *.h файлов ?

Тема в разделе "WASM.WIN32", создана пользователем young_man, 18 авг 2005.

  1. young_man

    young_man New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2005
    Сообщения:
    117
    Адрес:
    Ukraine
    Добрый день.

    Моя проблемка:)

    1.хотел получить библиотеку lib.

    2.Написал на С++ 2-функции и сохранил их в файл *.cpp
    Код (Text):
    1.  
    2. //----------MathLib.cpp----------------
    3. #include <cmath>
    4. #include "MathLib.h"
    5.  
    6. // Arithmetic functions
    7. int MLSquare (int iArg_)
    8. {
    9.         return (iArg_ * iArg_);
    10. }
    11.  
    12. int MLSquareroot (int iArg_)
    13. {
    14.         return ((int)sqrt ((double)iArg_));
    15. }
    16.  
    17. float MLSquare (float fArg_)
    18. {
    19.         return (fArg_ * fArg_);
    20. }
    21.  




    3. расписал файл *.h


    Код (Text):
    1.  
    2. //-----------MathLib.h-----------
    3.         #ifndef MATHLIB_H
    4.         #define MATHLIB_H
    5.  
    6.         // Constants
    7.         const float MLPI = 3.14159f;
    8.  
    9.         // Arithmetic functions
    10.         int MLSquare (int iArg_);
    11.         int MLSquareroot (int iArg_);
    12.         float MLSquare (float fArg_);
    13.         #endif
    14.  


    4.создал проект Win32 Static Library добавил *.cpp и *.h

    5.все остальное по умолчанию

    6.cобрал проект - получил lib

    7.c помощью программы l2inc хотел получить файл *.inc

    в ответ надпись -
    Код (Text):
    1.         D:\l2inc12>L2INCA.EXE  /M MathLib.lib
    2.         MathLib.lib
    3.         Pass 1234
    4.         Library has no imports


    Если я подключаю в проекте VС++ *.cpp и *.h все работает, но как для

    поиспользовать эти ф-ции в asm - программах ?( который я стараюсь учить).



    Вопрос:

    Подскажите пожалуйста, что я не учел в этом *.cpp для того чтобы

    моя Library получила способность импортировать мои функции. Ну и чтобы получить *.inc из моей *.h или *.lib.

    Извините. Спасибо.
     
  2. Edmond

    Edmond узник замка IF THEN ELSE

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    203
    Адрес:
    WASM.RU
    young_man



    Ты скармливаешь не ту либу!!!



    предназначена для либ, которые содержат импорт. А твоя лица - это обычная БД из объектных файлов.



    Ты создал проект создал проект Win32 Static Library добавил *.cpp и *.h



    а надо было DLL.



    Если сделаешь DLL всё получится.



    Если хочешь статик, пиши inc руками.



    Что касается импортирования функций в asm, смотри директиву export в С++ и ASM.



    Всё, что тебе надо - правильно указать имена экспортируемых процедур.
     
  3. young_man

    young_man New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2005
    Сообщения:
    117
    Адрес:
    Ukraine
    ... не сочтите за назойливость, но подскажите еще раз как создать в VC ++ 6.0 либу содержащую импорты.

    Я переделывал свой случай так :


    Код (Text):
    1.  
    2. //-----------MathLib.h-----------
    3.         #ifndef MATHLIB_H
    4.         #define MATHLIB_H
    5.  
    6.         // Constants
    7.         const float MLPI = 3.14159f;
    8.  
    9.         // Arithmetic functions
    10.         extern "C" __declspec(dllexport)  int MLSquare (int iArg_);
    11.         extern "C" __declspec(dllexport)  int MLSquareroot (int iArg_);
    12.         extern "C" __declspec(dllexport)  float MLSquare (float fArg_);
    13.         #endif
    14.  


    ... однако привиредливая l2inc все равно не довольна и возвращает
    Код (Text):
    1.         D:\l2inc12>L2INCA.EXE  /M MathLib.lib
    2.         MathLib.lib
    3.         Pass 1234
    4.         [b]Library has no imports[/b]
    5.  
    6.  


    ... и в asm - программе эта lib естественно - а не подключается :dntknw:(

    В инете - искал, такое впечатление, что никто никогда это не делает. В проектах сpp - без проблем. Спасибо.
     
  4. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    Я делал несколько иначе:



    Саму либу компилировал и линковал батником с такими ключами:

    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 :lol: WORD,:lol: WORD,:lol: WORD,:lol: WORD

    _BM PROTO :lol: WORD,:lol: WORD,:lol: WORD,:lol: WORD

    main PROTO :lol: WORD,:lol: WORD,:lol: WORD

    preBmBc PROTO :lol: WORD,:lol: WORD,:lol: WORD

    preBmGs PROTO :lol: WORD,:lol: WORD,:lol: WORD

    suffixes PROTO :lol: WORD,:lol: WORD,:lol: WORD



    P.S.

    это ключи для cl из vc 7.0, как там в 6.0 не знаю, но должно быть также
     
  5. Edmond

    Edmond узник замка IF THEN ELSE

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    203
    Адрес:
    WASM.RU




    Ну почему, делает конечно.

    Даже главы есть по такому вопросу.



    Вы должны объвить внешними имена. Допустим С это делает по умолчанию для библиотеке.



    В Асме надо написать файл



    EXTERNDEF С MyFun:near



    !!! Вы должны помнить, что компиляторы искажают имя функции !!!



    (см. определение EXTERNDEF )



    Это значит, что вы импортируйте функцию MyFun, коорая на самом деле называется _MyFun из библиотеки.



    С++ как правило извращает имен функций сильнее.

    Поэтому следует подсматривать в lib, как именно она их извратила (а там это есть).
     
  6. Edmond

    Edmond узник замка IF THEN ELSE

    Публикаций:
    0
    Регистрация:
    2 сен 2002
    Сообщения:
    203
    Адрес:
    WASM.RU
    Кстати загляните в Masm32.inc
     
  7. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    В аттаче три файла, необходимые для получения .lib и .inc для использования в программе, написаной на асме.

    Укажи в .bat свои пути к папкам bin, include, lib и запусти его.

    Полученные .lib и .inc работают в асме, проверил.



    Из тела .cpp удалил все упоминания о float и double, а то асмовый линкер не находит то ли функции, то ли типы, которые с++ пихает в либу и возникает ошибка:

    : unresolved external symbol __fltused

    : unresolved external symbol __ftol



    Где искать эти __fltused и __ftol, чтобы указать линкеру - не знаю, поэтому сделал проще: заменил sqrt на асм-вставку.

    Из ассемблера вызываются ф-ции либы как обычно:


    Код (Text):
    1.     include     mathlib.inc
    2.     includelib  mathlib.lib
    3.  
    4. .data
    5.     float_value     dd 3.5
    6.     float_result    dq 0
    7. .code
    8.        
    9.     invoke  MLSquare,32
    10.     PrintDec eax                    ;eax = 1024
    11.     invoke  MLSquareroot,eax
    12.     PrintDec eax                    ;eax = 32
    13.     invoke  MLSquareFloat,float_value
    14.     push    eax
    15.     fld     dword ptr[esp]
    16.     fstp    qword ptr[float_result]
    17.     pop     eax
    18.     PrintDouble float_result        ;1.870829






    единственно нужно положить .lib и .inc к .asm.



    Если надо либу делать не батником, а из среды vc++ 6.0, то попробуй изменить в IDE параметры компилятора и линкера на такие же, как в .bat





    [​IMG] _247312667__MathLib.zip
     
  8. young_man

    young_man New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2005
    Сообщения:
    117
    Адрес:
    Ukraine
    Edmond

    cresta

    ... огромное спасибо за внимание ко мне! Все получилось с Вашей помощью.