Линковка и вызов своей сишной функции из Rust

71 views
Skip to first unread message

Даниил Сучков

unread,
Mar 10, 2015, 10:13:02 AM3/10/15
to rust-r...@googlegroups.com
Не получается сделать вызов сишной функции из Rust. Нужно скомпилировать .сpp и потом вызывать его из Rust.
Из тех инструкций, что удалось найти, следует, что нужно сначала собрать объектный файл при помощи, например, gcc, а потом собрать его в .a файл через ar
делаю так:
gcc -c foo.сpp
ar rsc -o libfoo.a foo.o

потом libfoo.a помещаю в директорию rust'a к остальным .a

foo.cpp:
extern "C"
{
    #include <cstdio>
    extern void beep();

    void beep()
    {
        printf("It works!\n");
    }
}

rust:
#[link(name = "foo")]
extern {
    fn beep();
}

fn main() {
    unsafe { beep(); }
}

Делаю cargo build, получаю такую вот ошибку:
ld: skipping incompatible C:/Program Files (x86)/Rust/bin/rustlib/x86_64-pc-windows-gnu/bin/../lib/gcc/x86_64-w64-mingw32/4.9.1/../../../libfoo.a when searching for -lfoo
(тут ещё строчек 10 +- таких же)
ld: cannot find -lfoo

Подскажите пожалуйста, в чём может быть проблема?

Nikolay Pavlov

unread,
Mar 10, 2015, 11:54:50 AM3/10/15
to Даниил Сучков, rust-r...@googlegroups.com
Чтобы у меня это работало, мне пришлось скомпилировать библиотеку с
-fPIC. Но ошибка только одна и явно указывала на необходимость
использования -fPIC. Кроме того, я на linux (Gentoo amd64).

10 марта 2015 г., 17:13 пользователь Даниил Сучков
<suc.d...@gmail.com> написал:
> --
> Вы получили это сообщение, поскольку подписаны на группу "Rust по-русски".
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения,
> отправьте письмо на электронный адрес
> rust-russian...@googlegroups.com.
> Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
> https://groups.google.com/d/msgid/rust-russian/cadb5617-e325-4d0c-b37e-bd676110a68e%40googlegroups.com.
> Чтобы настроить другие параметры, перейдите по ссылке
> https://groups.google.com/d/optout.

Даниил Сучков

unread,
Mar 11, 2015, 1:44:09 PM3/11/15
to rust-r...@googlegroups.com
Итак, проблема решена и заключалась она в том, что rust был с gcc для x64_86 на борту, а основной gcc в системе был i686. 
После установки rust с gcc x86_64-win32-seh-rev1 на борту, файлы, собранные при помощи аналогичной версии gcc спокойно прилинковались.

вторник, 10 марта 2015 г., 20:13:02 UTC+6 пользователь Даниил Сучков написал:
Reply all
Reply to author
Forward
0 new messages