Создание кросс-платформенного приложения (с использованием Rust)
Я начал изучать язык программирования Rust, и я использую Linux. Я хотел бы создать кросс-платформенное приложение, используя этот язык.
Возможно, вопрос не связан с языком Rust, но тем не менее, как мне это сделать? Я заинтересован в создании кросс-платформенного приложения "Hello World", а также для более сложных. Мне просто нужно понять.
Итак, что мне делать?
UPDATE
Что я хочу сделать, так это возможность запускать программу на трех разных платформах без изменения источников. Должен ли я создавать новый двоичный файл для каждой платформы из источников? Точно так же, как я мог сделать в C
Ответы
Ответ 1
Лучший способ понять это - загрузить исходный код Servo и изучить его самостоятельно. Servo - это абсолютно кросс-платформенная кодовая база, поэтому ей придется решать все эти вопросы, отвечать ли они в файлах сборки/конфигурации или на источник Rust.
Ответ 2
Для запуска на нескольких платформах вам необходимо создать исполняемый файл для каждой из них, как прокомментировал @huon-dbauapp.
Это довольно просто с Rust. Вы используете "--target =" с rustc, чтобы сообщить ему, что вы хотите построить. Тот же флаг работает с Cargo.
Например, эта сборка для цели ARM:
cargo build --target=arm-unknown-linux-gnueabihf
См. Rust Flexible Target Specification для получения дополнительной информации о целях.
Однако Rust не поставляется с стандартным ящиком, скомпилированным для ARM (по состоянию на июнь 2015 года). Если это так для вашей цели, вам сначала нужно скомпилировать std Crates для цели самостоятельно, что включает в себя компиляцию компилятора Rust из исходного кода и указание цели для этой сборки!
Для информации большая часть этого скопирована с: https://github.com/japaric/ruststrap/blob/master/1-how-to-Cross-Compile.md
Следующие инструкции относятся к gcc, поэтому, если у вас его нет, вам нужно его установить. Вам также понадобятся соответствующие инструменты кросс-компиляции, поэтому для gcc:
sudo apt-get install gcc-arm-linux-gnueabihf
Компилировать Rust STD Crate For ARM
В следующем примере предполагается, что вы уже установили текущую версию Rust Nightly, поэтому мы просто получим исходные коды и скомпилируем для ARM. Если вы используете другую версию компилятора, вам нужно получить ее, чтобы убедиться, что ваши библиотеки ARM соответствуют версии компилятора, который вы используете для создания своих проектов.
mkdir ~/toolchains
cd ~/toolchains
git clone https://github.com/rust-lang/rust.git
cd rust
git update
Сборка rustc для ARM
cd ~/toolchains/rust
./configure --target=arm-unknown-linux-gnueabihf,x86_64-unknown-linux-gnu
make -j4
sudo make install
Обратите внимание, что "-j4" требуется как минимум 8 ГБ ОЗУ, поэтому, если вы столкнулись с проблемой, описанной выше, попробуйте "make".
Установите библиотеки ARM rustc В родной сборке rustc
sudo ln -s $HOME/src/rust/arm-unknown-linux-gnueabihf /usr/lib/rustlib/arm-unknown-linux-gnueabihf
Создайте hello.rs, содержащий:
pub fn main() {
println!("Hello, world!");
}
Скомпилируйте hello.rs и сообщите rustc имя перекрестного -C компилятора (который должен быть в вашем PATH):
rustc -C linker=arm-linux-gnueabihf-gcc-4.9 --target=arm-unknown-linux-gnueabihf hello.rs
Убедитесь, что созданный двоичный файл действительно является двоичным $ file hello
ARM: $ file hello
hello: ELF 32-битный общий объект LSB, ARM, EABI5 версия 1 (SYSV), (..)
УСПЕХ !!!:
Проверьте: двоичный файл должен работать на устройстве ARM
$ scp hello [email protected]:~
$ ssh [email protected] ./hello
Hello, world!
Я использовал это для создания и связывания проекта Rust с отдельной библиотекой C. Инструкции, подобные приведенным выше, о том, как это сделать, динамически или статически, содержатся в отдельном посте, но я уже использовал свою квоту на ссылку!
Ответ 3
Похоже, что компилятор ржавчины может быть не готов к созданию автономных двоичных файлов для окон (см. раздел здесь), поэтому это возможно не может быть сделано.
Для систем posix в основном это просто Work Work, если вы не пытаетесь сделать материал GUI.
Ответ 4
Да, вам не нужно будет менять исходный код, если вы не используете конкретные библиотеки, которые не являются межплатформенными.
Но поскольку @dbaupp говорит, что на каждой платформе родные исполняемые файлы различны, * nix использует ELF, Windows PE и OSX Mach-O. Поэтому вам нужно будет скомпилировать его для каждой платформы.
Я не знаю состояния кросс-компиляции в ржавчине, но если они уже реализованы, то вы должны иметь возможность создавать все двоичные файлы на одной платформе, если нет, вам придется строить каждый бинарный файл это платформа.