Что-то у меня склероз. как сделать DLL на C?
New->Project->Win32 Project->"OK"->Application Settings->DLL
__declspec(dllexport)а там, где их импортишь -
__declspec(dllimport)а если ещё и человеческие имена хочешь внутри DLL, то
extern "C" {Ну и
void func {
blablabla;
}
}
__stdcallкуда-нибудь присобачить можно
а если не импортю, а LoadLibrary, GetProcAddress?
Надо писать
extern "C" {Вроде так. Впрочем, мне самому интересно стало, сейчас проверю
__declspec(dllexport) int megafunction(int x) {
return x+1;
}
}
Дело в том, что если не писать extern "C", то компилятор C++ (если компилировать им) будет портить имена функций, добавляя в них описания типов аргументов (чтобы могли экспортироваться две функции с одним именем, но разным набором параметров). В языке C такого быть не может и extern "C" явно укажет компилятору, что имена функций mangle'ить не надо.
А __declspec(dllexport) зачем?
не все функции из единицы трансляции экспортятся
Это указание для компилятора Visual C++, что эта функция экспортируемая.
Эээ. А чем она от остальных отличается?
О, хрен его знает. Может и не надо писать такое, если динамически подгружать DLL'ку.
без директивы - это обычная функция. с директивой - экспортируемая. неужто механизм .so другой?
Проверил, надо.
Все функции экспортируются и доступны через dlopen/dlsym.
Уж не знаю, как там устроены dll'ки и so'шки
Виндовый линкер публикует адреса функций в exported symbols только если от него этого явно потребовать, например через __declspec(dllexport) или отметить функцию в .def файле как экспортируемую. Последним способом можно делать всякие извраты, например, сэкспортировать функцию без имени (только по номеру точки входа).
Оставить комментарий
yolki
В дельфях всё очевидно (для меня):Как сделать тоже самое в C? сойдёт MSVC или Builder