#rust #ffi #lib
#Ржавчина #ffi #либ
Вопрос:
Я хотел бы написать библиотеку, чтобы упростить написание DLL-плагинов для программ, не подверженных коррозии, с API/ABI на C, но я не вижу, как я мог бы этого достичь.
В моем poc у меня есть такие функции, как
#[no_mangle] (repeated each time) extern "C" fn init(*mut *mut ctx) -gt; i32 { ... } extern "C" fn do_something(*mut ctx) -gt; i32 { ... } extern "C" fn cleanup(*mut ctx) -gt; i32 { ... }
Я использовал Box
структуру ed для своей ctx
переменной.
У меня есть много шаблонного кода в моем PoC для этого, и я хотел бы поместить все это в библиотеку, чтобы не повторять это везде.
Таким образом, в основном моя цель состоит в том, чтобы иметь lib
то, что позволяет мне просто определять пользовательский контекст и функции для каждого плагина, немного похоже:
use plugin_lib; struct MyCtx { ... } fn my_init(pp_ctx: *mut *mut MyCtx) -gt; i32 { ... }; fn my_init(p_ctx: *mut MyCtx) -gt; i32 { ... }; fn my_init(p_ctx: *mut MyCtx) -gt; i32 { ... };
Но если я попытаюсь создать библиотеку с отсутствующими my_
функциями, она, очевидно, не будет связываться, верно? И в то же время, если я просто определю объекты в библиотеке и попытаюсь использовать их в части плагина, я не смогу экспортировать функции, если не напишу их все снова (или, по крайней мере, небольшие обертки для вызова библиотек, что звучит некрасиво).
Каков был бы правильный способ построить это? Или, если их несколько, как бы вы это сделали?
Комментарии:
1. похоже, вам следует создать макрос, который могут использовать пользователи вашей библиотеки, который будет выполнять эти функции для них
2. Это действительно похоже на то, что мне нужно, ты прав, спасибо! Могу ли я экспортировать их в пакет для распространения, как это было бы с файлом lib? (Это все равно будет код, не двоичный внутри, как я понимаю, но все же?)
3. Когда-то так писались программы, но это вызывало много проблем, и только авторы могли добавлять сертифицированные плагины. Я бы попытался добавить интерпретатор deno и сделать возможным написание плагинов на языке, подобном js, который может получить доступ только к определенным методам из основной системы.