Попытался я написать dll для Колибри при помощи MSVC 6.0 Но скомпилировать при помощи MSVC dll формата MS COFF под Колибри у меня не получилось. Если в опциях установить флаг "ignore all default librarys" , то код просто не компилируется(выдаёт сообщеие об ошибке). А если этот флаг не устанавливать, то в созданную dll импортируются виндовые функции KERNEL32.
Смотрел компилятор MinGW. Насколько я понял, он умеет только превращать статические библиотеки в dll-ки винды.А чтобы без привязки к винде - это он не может.
Кто-нибудь пробовал/знает как можно создать dll формата MS COFF на языке высокого уровня(желательно C) без привязки к платформе win ?
Написание dll для Колибри на языках высокого уровня.
-
KolibriOS-перспективная ос!
Kolibri is best operation system in the world!
Попробуй добавить в MSVC 6.0 /FORCE:UNRESOLVED - при сборке все(почти все) ошибки будут игнарироваться.
Вот это исходный код dll на C.
При установке флага /FORCE:UNRESOLVED MSVC выдаёт следующее :
Нисмотря на ошибки dll создаётся.Только в Колибри она не грузиться(наверное неправильно оформлена dll).
Что такое "__DllMainCRTStartup@12" и как от него избавиться - я незнаю.
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);
}
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)
Что такое "__DllMainCRTStartup@12" и как от него избавиться - я незнаю.
andrew_programmer
Колибри не умеет грузить PE DLL. Чтобы сделать DLL на С надо
скомпилировать все файлы в один obj-файл и сделать таблицу экспорта
MSVC добавляет знак подчёркивания ко всем именам, способ отменить это
я не нашёл, __pascal в VС8 не поддерживается. Остаётся сгенерировать asm,
подредактировать и скомпилировать ml /Cp имя_файла.
Колибри не умеет грузить 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;
}
я не нашёл, __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
Serge
А как сделать, чтобы MSVC генерировал ассемблерный листинг ?
>и скомпилировать ml /Cp имя_файла.
Что такое "ml/Cp" ? Как этим пользоваться ?
И ещё один вопрос. Как сделать, чтобы все obj файлы объединились в один - главный obj файл ?
А как сделать, чтобы MSVC генерировал ассемблерный листинг ?
>и скомпилировать ml /Cp имя_файла.
Что такое "ml/Cp" ? Как этим пользоваться ?
И ещё один вопрос. Как сделать, чтобы все obj файлы объединились в один - главный obj файл ?
Если компилируешь из среды то посмотри в настройках проекта опцию
С/С++ -> Output Files -> Assembler Output
или задай ключ /FA для командной строки.
Чтобы получить один файл надо или собрать все исходники в один файл или включить все ссылки в один главный файл при помощи #include так же как и в FASM.
ml это MS ассемблер. Обычно находится в одном каталоге с cl.exe link.exe и т.д. /Cp - необязательный ключ указывает ассемблеру сохранять регистр в именах переменных. Дополнительные ключи показываются командой ml /? Для компиляции обычно хватает ml my_prog.asm
Компилятор создаёт в выходном файле дополнительные секции поэтому лучше компилировать через ассемблер.
С/С++ -> Output Files -> Assembler Output
или задай ключ /FA для командной строки.
Чтобы получить один файл надо или собрать все исходники в один файл или включить все ссылки в один главный файл при помощи #include так же как и в FASM.
ml это MS ассемблер. Обычно находится в одном каталоге с cl.exe link.exe и т.д. /Cp - необязательный ключ указывает ассемблеру сохранять регистр в именах переменных. Дополнительные ключи показываются командой ml /? Для компиляции обычно хватает ml my_prog.asm
Компилятор создаёт в выходном файле дополнительные секции поэтому лучше компилировать через ассемблер.
Serge
Спасибо за советы.
У меня ml почему-то не оказалось. Но я отредактировал ассемблерный код так, чтобы он компилировался FASM-ом. И все заработало !
Спасибо за советы.
У меня ml почему-то не оказалось. Но я отредактировал ассемблерный код так, чтобы он компилировался FASM-ом. И все заработало !
Who is online
Users browsing this forum: No registered users and 14 guests