исполняемый файл и пользовательская библиотека.
Зависимости такие:
exe <- lib
user_lib <- lib
Пользовательская библиотека user_lib — это что-то вроде динамически подключаемого модуля при старте. При запуске exe необходимо вызвать функцию fn init(), которую пользователь напишет в своей библиотеке user_lib, и если не напишет — выдать ошибку.
Теоретически в lib можно засунуть какой-нибудь трейт, если нужно.
Какие варианты решения могут быть для такой хитровывернутой фигни?
буквально сделать extern C и динамически линковать в exe не вариант:?
Динамически линковать — это вариант. Собственно, это единственный вариант, однако мне extern "C" в этой ситуации не нравится, я бы хотел что-то нативное растовое.
ну у раста есть dylib но в каком оно состоянии я хз. с extern C точно проблем не будет.
А ведь в каком-нибудь сишарпе эта проблема решается простой аннотацией, эхх.
У какого-нибудь сишарпа есть рантайм
Если хочется динамической загрузки, то обязательно нужно выставлять из библиотеки C ABI.
Меня Гольдштейн тоже подталкивает к этому решению. В принципе оно нормальное, мне просто не хотелось спускаться на этот уровень. Но видимо придётся.
так для пользователей можно сделать штуку типа #[tokio::main], пусть генерирует extern "C" и прочие кишки
По другому никак. Без чего-то вроде strong-named assembly и криптографической верификации программа не может быть уверена, что загружает библиотеку скомпилированную растом, а значит и гарантий safety никаких не может быть. Ну и ABI у раста нестабильный.
Выглядит как вариант.
Оно без гарантий того что будет работать в другую фазу луны
в сишарпе каждая либа в себе мегатонну метаданных и аннотаций тащит
Зато декомпилить весело
Обсуждают сегодня