Что-то у меня склероз. как сделать DLL на C?
(VS 2003)
New->Project->Win32 Project->"OK"->Application Settings->DLL
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'ку.
к ней нельзя GetProcAddress, она не динамическая, с ней по-другому стек работает, да мало ли различий?
без директивы - это обычная функция. с директивой - экспортируемая. неужто механизм .so другой?
без директивы - это обычная функция. с директивой - экспортируемая. неужто механизм .so другой?
Проверил, надо.
Кстати, gcc никаких директив на эту тему писать не нужно.
Все функции экспортируются и доступны через dlopen/dlsym.
Уж не знаю, как там устроены dll'ки и so'шки
Все функции экспортируются и доступны через dlopen/dlsym.
Уж не знаю, как там устроены dll'ки и so'шки

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