Size: a a a

Rust — русскоговорящее сообществo

2020 October 16

в🧇

вафель 🧇 in Rust — русскоговорящее сообществo
Mikhail Voronov
могу ответить leonardo-m, если хочешь
Давай
источник
2020 October 17

AT

Anton TrionProg in Rust — русскоговорящее сообществo
Привет. Нужна помощь с FFI. Странная хрень творится. В общих словах, DLLшка на расте должна вызвать функцию в екзешнике на C/C++. Поэтому функция на С становится колбеком и я её вызываю на расте.

Трабла в том, что возникают проблемы с возвращением этой функцией значения. Какой-то мусор возвращается(если число большое, маленькое срабатывает, возращение u32 работает), а если Option<ptr>, то вообще сегфолт. Вообще, функция должна возвращать указатель, но он, будучи 8мибайтным, ломается.

Сигнатура
pub type FooCallback = extern "C" fn(*mut c_void, Position2D) -> u64

На крестах:
u64 foo(SomeClass* class, Position2D position) { ..}

Position2D это структура, содержащая x:i32, y:i32

Вызов колбека растом:
let foo:FooCallback = ..//Я пропущу, там специальной функцией присваивается.
let value = foo(some_class, position);

Вот вроде всё работает, а внезапно сегфолт. Есть идеи? Может я забыл где-то приписать какой-то extern?

И что за хрень, что Option<*const c_void> весит 128 байт?!
источник

MP

Mag Pie in Rust — русскоговорящее сообществo
кресты что за компилятор?
источник

MP

Mag Pie in Rust — русскоговорящее сообществo
ABI совпадает у раста и у приложеньки?
источник

MP

Mag Pie in Rust — русскоговорящее сообществo
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
Компилятор UnrealEngine. У него некий диалект, который умудряется всовывать GC в классы. Но в целом, думаю что msvc. Спасибо за наводку, подумаю..
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
DLL на расте видимо должна юзать target msvc?
источник

MP

Mag Pie in Rust — русскоговорящее сообществo
Anton TrionProg
DLL на расте видимо должна юзать target msvc?
Да
источник

MP

Mag Pie in Rust — русскоговорящее сообществo
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
Mag Pie
Да
Хм, трудная тема. Не знаешь, как узнать, какая у меня текущая target, надо ли как-то указывать, что мол делай длл этим ABI. И если я заюзаю MSVC, то будет просто extern "C", а не extern "Win64" и вообще хз что?
источник

MP

Mag Pie in Rust — русскоговорящее сообществo
источник

MP

Mag Pie in Rust — русскоговорящее сообществo
источник

MP

Mag Pie in Rust — русскоговорящее сообществo
Anton TrionProg
Хм, трудная тема. Не знаешь, как узнать, какая у меня текущая target, надо ли как-то указывать, что мол делай длл этим ABI. И если я заюзаю MSVC, то будет просто extern "C", а не extern "Win64" и вообще хз что?
ABI никак кроме как переключением тулчейна не меняется. через rustup устанавливаешь нужный тулчейн и через него и собираешь
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
Mag Pie
ABI никак кроме как переключением тулчейна не меняется. через rustup устанавливаешь нужный тулчейн и через него и собираешь
да вроде msvc, не так ли?
источник

MP

Mag Pie in Rust — русскоговорящее сообществo
Возможно имеет смысл попробовать i686
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
Mag Pie
ABI никак кроме как переключением тулчейна не меняется. через rustup устанавливаешь нужный тулчейн и через него и собираешь
Кстати, вопрос тоже в тему. Я вот всё не могу понять, что значат в крестах эти всякие API_IMPORT и подобное перед классами и тд.
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
Mag Pie
Возможно имеет смысл попробовать i686
У меня проц AMD.
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
Mag Pie
Возможно имеет смысл попробовать i686
UPD к вопросу выше. Забыл приписать
API_IMPORT void process(unsigned int count);
источник

MP

Mag Pie in Rust — русскоговорящее сообществo
Anton TrionProg
У меня проц AMD.
ну что за молодежь пошла, а
источник

AT

Anton TrionProg in Rust — русскоговорящее сообществo
Кстати в крестах они пишут:
extern "C" {
 API_IMPORT void process(unsigned int count);
} Мб надо экстерн написать.
источник