Что-то у меня склероз. как сделать DLL на C?

yolki

В дельфях всё очевидно (для меня):

library rp;
const dParam=0.1;
function P(x,y:double):double; stdcall;
begin
Result:=y;
end;
function Q(x,y:double):double; stdcall;
begin
Result:=x*y+x*x-dParam*x-0.2*dParam*dParam;
end;
exports P,Q;
end.

Как сделать тоже самое в C? сойдёт MSVC или Builder

Bird_V

(VS 2003)
New->Project->Win32 Project->"OK"->Application Settings->DLL

bobby

А перед функциями надо писать
__declspec(dllexport)
а там, где их импортишь -
__declspec(dllimport)
а если ещё и человеческие имена хочешь внутри DLL, то
extern "C" {
void func {
blablabla;
}
}
Ну и
__stdcall
куда-нибудь присобачить можно

yolki

а если не импортю, а LoadLibrary, GetProcAddress?

bobby

Тогда ты точно хочешь нормальные имена функций, чтобы по ним искать.
Надо писать
extern "C" {
__declspec(dllexport) int megafunction(int x) {
return x+1;
}
}
Вроде так. Впрочем, мне самому интересно стало, сейчас проверю

bobby

Дело в том, что если не писать extern "C", то компилятор C++ (если компилировать им) будет портить имена функций, добавляя в них описания типов аргументов (чтобы могли экспортироваться две функции с одним именем, но разным набором параметров). В языке C такого быть не может и extern "C" явно укажет компилятору, что имена функций mangle'ить не надо.

Marinavo_0507

А __declspec(dllexport) зачем?

yolki

не все функции из единицы трансляции экспортятся

bobby

Это указание для компилятора Visual C++, что эта функция экспортируемая.

Marinavo_0507

Эээ. А чем она от остальных отличается?

bobby

О, хрен его знает. Может и не надо писать такое, если динамически подгружать DLL'ку.

yolki

к ней нельзя GetProcAddress, она не динамическая, с ней по-другому стек работает, да мало ли различий?
без директивы - это обычная функция. с директивой - экспортируемая. неужто механизм .so другой?

bobby

Проверил, надо.

bobby

Кстати, gcc никаких директив на эту тему писать не нужно.
Все функции экспортируются и доступны через dlopen/dlsym.
Уж не знаю, как там устроены dll'ки и so'шки

shlyumper

Виндовый линкер публикует адреса функций в exported symbols только если от него этого явно потребовать, например через __declspec(dllexport) или отметить функцию в .def файле как экспортируемую. Последним способом можно делать всякие извраты, например, сэкспортировать функцию без имени (только по номеру точки входа).
Оставить комментарий
Имя или ник:
Комментарий: