Иногда компилить проги / библиотеки естессно чужие это прям как расследование какоето:

Вот значит скачал http://www.kmc.gr.jp/~ohai/rubysdl_download.en.html, сначала бинарники. Все заработало. Но потом скачал исходники и захотелось их откомпилить (типа развлечение нашел):



Откомпилил почти сразуже, получил dll, переименовал в so и бросил в папку где все ruby-ишные so-шники. Не заработало. Начала разбираться (почемуто стало интерессно), исходники ведь на C. Понял что после загрузки библиотеки в Ruby создается Модуль (можно сказать class). Причом не автоматом, а в функции, тама прямо так написано:



void Init_sdl()

{

mSDL = rb_define_module("SDL");

eSDLError = rb_define_class_under(mSDL,"Error",rb_eStandardError);

rb_define_module_function(mSDL,"init",sdl_init,1);

rb_define_module_function(mSDL,"initedSystem",sdl_wasInit,1);

.....

}



Типа с помощью Сишных функций (с префиксом rb) которые загружаются из библиотеки, которую предоставляет ruby. Т.е. там обертки для каждого действия в ruby. И т.к. в ruby можно определять класс/модуль не сразу а на нескольких строках (язык то динамический) то вот собственно это и происходит в функциях начиная с rb_define_module.



Но вот где вызывается эта функция я не нашел. Помог текст ошибки при запросе подключить библиотеку "require sdler.so": типа не найдена функция Init_sdler (файл у меня назывался sdler.so). Хы, оказалось при загрузки so-шника вызывается (или ruby вызывает) функция Init_ИМЯso. Перекомпилил значит библу токо с Init_sdler. Но при запуске она все равно не нашлась. Доперло что нужно писать:



__declspec(dllexport) void Init_sdler() { ... }



Вот тады все заработало



P.S. Получается на ruby можно любую (или не любую ) библу через C/С++ написать. Токо с оболочки делать это не самое приятное занятие.