Page 1 of 1

Написание dll для Колибри на языках высокого уровня.

Posted: Wed Jun 13, 2007 5:46 pm
by andrew_programmer
Попытался я написать dll для Колибри при помощи MSVC 6.0 Но скомпилировать при помощи MSVC dll формата MS COFF под Колибри у меня не получилось. Если в опциях установить флаг "ignore all default librarys" , то код просто не компилируется(выдаёт сообщеие об ошибке). А если этот флаг не устанавливать, то в созданную dll импортируются виндовые функции KERNEL32.
Смотрел компилятор MinGW. Насколько я понял, он умеет только превращать статические библиотеки в dll-ки винды.А чтобы без привязки к винде - это он не может.

Кто-нибудь пробовал/знает как можно создать dll формата MS COFF на языке высокого уровня(желательно C) без привязки к платформе win ?

Posted: Wed Jun 13, 2007 6:27 pm
by Pavia
Попробуй добавить в MSVC 6.0 /FORCE:UNRESOLVED - при сборке все(почти все) ошибки будут игнарироваться.

Posted: Wed Jun 13, 2007 7:55 pm
by andrew_programmer
Вот это исходный код dll на C.

Code: Select all

/*
     test 

*/

#define DllExport extern "C" __declspec(dllexport) 

DllExport int __stdcall summa(int a,int b) 
{ 
   int sum;

   sum=a+b;
   return(sum);
} 
При установке флага /FORCE:UNRESOLVED MSVC выдаёт следующее :

Code: Select all

--------------------Configuration: test - Win32 Debug--------------------
Compiling...
main.cpp
Linking...
LINK : warning LNK4075: ignoring /INCREMENTAL due to /FORCE specification
   Creating library Debug/test.lib and object Debug/test.exp
LINK : error LNK2001: unresolved external symbol __DllMainCRTStartup@12
Debug/test.dll : warning LNK4088: image being generated due to /FORCE option; image may not run

test.dll - 1 error(s), 2 warning(s)
Нисмотря на ошибки dll создаётся.Только в Колибри она не грузиться(наверное неправильно оформлена dll).
Что такое "__DllMainCRTStartup@12" и как от него избавиться - я незнаю.

Posted: Thu Jun 14, 2007 12:29 am
by Serge
andrew_programmer

Колибри не умеет грузить PE DLL. Чтобы сделать DLL на С надо
скомпилировать все файлы в один obj-файл и сделать таблицу экспорта

Code: Select all

typedef struct
{ char *name;
  void *addr;
} EXP;

int __stdcall START(int state);
int my_func(int a, int b);

EXP EXPORTS[]={ {"START", START},
                {"version", (void *)0x00010001},  
                {"MyFunc", my_func},
                0,0
              };   

int __stdcall START(int state)
{
  return 1;
}

int my_func(int a, int b)
{
  return a+b;
}
MSVC добавляет знак подчёркивания ко всем именам, способ отменить это
я не нашёл, __pascal в VС8 не поддерживается. Остаётся сгенерировать asm,
подредактировать

Code: Select all

        .686P
        .XMM
        .model  flat

PUBLIC  EXPORTS
_DATA   SEGMENT

$SG579  DB      'START', 00H
$SG580  DB      'version', 00H
$SG582  DB      'MyFunc', 00H

EXPORTS DD      FLAT:$SG579
        DD      FLAT:_START@4
        DD      FLAT:$SG580
        DD      010001H
        DD      FLAT:$SG582
        DD      FLAT:_my_func
        DD      00H
        DD      00H
и скомпилировать ml /Cp имя_файла.

Posted: Thu Jun 14, 2007 8:38 am
by andrew_programmer
Serge

А как сделать, чтобы MSVC генерировал ассемблерный листинг ?

>и скомпилировать ml /Cp имя_файла.

Что такое "ml/Cp" ? Как этим пользоваться ?

И ещё один вопрос. Как сделать, чтобы все obj файлы объединились в один - главный obj файл ?

Posted: Thu Jun 14, 2007 12:23 pm
by Serge
Если компилируешь из среды то посмотри в настройках проекта опцию
С/С++ -> Output Files -> Assembler Output
или задай ключ /FA для командной строки.
Чтобы получить один файл надо или собрать все исходники в один файл или включить все ссылки в один главный файл при помощи #include так же как и в FASM.

ml это MS ассемблер. Обычно находится в одном каталоге с cl.exe link.exe и т.д. /Cp - необязательный ключ указывает ассемблеру сохранять регистр в именах переменных. Дополнительные ключи показываются командой ml /? Для компиляции обычно хватает ml my_prog.asm

Компилятор создаёт в выходном файле дополнительные секции поэтому лучше компилировать через ассемблер.

Posted: Thu Jun 14, 2007 3:07 pm
by andrew_programmer
Serge

Спасибо за советы.
У меня ml почему-то не оказалось. Но я отредактировал ассемблерный код так, чтобы он компилировался FASM-ом. И все заработало !