LINUX.ORG.RU

Rust и импорт из Lazarus

 ,


2

7

Всем привет! Допустим есть *.dll/*.so файл собранный в Lazarus. Либа закрытая, объектных файлов не будет. Lazarus позволяет аки делфи прописать ручками импортируемые функции и не париться, но в rust не нашёл историй успеха. Как мне импортировать функции из этой библиотеки в Rust?

Пытался так, но не катит:


extern crate libc;
use libc::{c_int};

#[link(name = "anal_zond")]
extern {
    fn  lib_version(major: *const c_int, minor: *const c_int, revision: *const c_int);
}

pub fn library_version() -> Option<Vec<i32>> {

    let major: c_int = 0;
    let minor: c_int = 0; 
    let revision: c_int = 0;
    unsafe {
        lib_version(&major, &minor, &revision);
    }
    Some(vec![major, minor, revision])
}

#[cfg(test)]
mod tests {
 
    use super::library_version;

    #[test]
    fn it_works() {
       let version = library_version().unwrap();
       println!("{:?}", version); 
    }
}

Хочется, что бы Rust компилировал даже в отсутствие библиотеки X, и чтобы не запускался исполняемый файл без неё, реально ли так?

★★★★

Последнее исправление: AntonyRF (всего исправлений: 1)
Ответ на: комментарий от FINKfreaky

кто нибудь просветите меня насчет Run-Time Dynamic Linking в линуксах и юниксах

ТС я тут влез к тебе в тред со своей фигней, но это как один из вариантов решения твоей проблемы

FINKfreaky
()

Если либа экспортирует C интерфейс, тогда нужно просто повторить эти методы в rust через extern «C».

Хочется, что бы Rust компилировал даже в отсутствие библиотеки X, и чтобы не запускался исполняемый файл без неё, реально ли так?

dlopen

RazrFalcon ★★★★★
()
Ответ на: комментарий от AntonyRF

в зависимости от abi лазаруса, можно либо нормальный ffi использовать, либо нарисовать плагин к компилятору. но dlopen проще

MyTrooName ★★★★★
()
Ответ на: комментарий от RazrFalcon

Если либа экспортирует C интерфейс, тогда нужно просто повторить эти методы в rust через extern «C».


  = note: ld: cannot find -lanal_zond


error: aborting due to previous error

error: Could not compile `lanal_zond`.

To learn more, run the command again with --verbose.
AntonyRF ★★★★
() автор топика
Ответ на: комментарий от AntonyRF

вот это идея для изучения раста запилить аналог dlopen на расте я бы взялся но я уже (или пока ещё) старый и ленивый такое пилить надо с юношеским задором

FINKfreaky
()
Ответ на: комментарий от FINKfreaky

Зачем его пилить, если уже есть?! Не ужели нельзя в Rust сделать как в Lazarus?

library TestLibrary;

uses SysUtils, Classes, Dialogs;

procedure DllMessage; export;
begin
  ShowMessage('Hello world from a Delphi DLL') ;
end;

exports DllMessage;

begin
end.

А брать либу просто так:

unit Unit1;

interface

  procedure DllMessage; external 'SimpleMessageDLL.dll'

implementation

procedure TForm1.Button1Click(Sender: TObject) ;
begin
   DllMessage;
end;

end.

Вот что я хочу видеть в Rust

AntonyRF ★★★★
() автор топика

Ай да и хрен с этими заморочками, возьму просто крэйт libloading

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Не находит, куда бы я её не положил =\ Rust'у на DLL для винды глубоко наплевать, ему нужен объектный файл из которого он бы взял информацию о функциях в DLL - так понял я, возможно ошибаюсь.

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от RazrFalcon

Ошибка то линкера. А если бы он импортировал бы функции как Lazarus, то ему бы было пофигу на наличие этой либы вне runtime

AntonyRF ★★★★
() автор топика
Последнее исправление: AntonyRF (всего исправлений: 1)
Ответ на: комментарий от RazrFalcon

А пардон, всё норм собирается, проблема в том что тест не запускается почему-то 0_о

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от FINKfreaky

Та не, это в Delphi\FPC стандартная фича =)

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от WatchCat

Если у тебя ld не находит либу, то наверное стоит копать в ту сторону?

Чувак, в Linux ок, а когда надо скомпилировать в Win? Линкер *.dll тебе не присосёт, если ты не знал

AntonyRF ★★★★
() автор топика
Ответ на: комментарий от AntonyRF

Линкер не ищет DLL, линкер ищет obj которого не существует

Разве в винде не с .lib должен линковаться?

O02eg ★★★★★
()
Ответ на: комментарий от AntonyRF

Microsoft-овский библиотекарь из пакета компиляторов (lib.exe) умеет создать библиотеку импорта. Он же может разобрать либу на объектники. Пробуйте скормить это расту.

FeyFre ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.