How to resolve linker error in RUST Cross compilation - rust

I am trying to achieve cross compilation in rust to the raspberry pi. However there was a linkage error while compiler:
error: linking with `cc` failed: exit status: 1
However for resolving that I have to download new linker and not use the default.
While doing so I checked the information of my raspberry system by using:
rustup show
Got the following result:
Default host: x86_64-unknown-linux-gnu
rustup home: /home/akumar/.rustup
installed targets for active toolchain
--------------------------------------
arm-unknown-linux-gnueabihf
armv7-unknown-linux-gnueabihf
x86_64-unknown-linux-gnu
active toolchain
----------------
stable-x86_64-unknown-linux-gnu (default)
rustc 1.64.0 (a55dd71d5 2022-09-19)
Now for resolving the issue I have to download the package using the following command:
sudo apt install gcc-armv7-unknown-linux-gnueabihf
but after running the command, I am getting the following error:
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package gcc-armv7-unknown-linux-gnueabihf

Please try this:
sudo apt install gcc-arm-linux-gnueabihf
for build your rust project:
cargo build --target=armv7-unknown-linux-gnueabihf
Please check tool - cross: https://github.com/cross-rs/cross
Cross uses docker for build and makes libraries isolation.

Related

How can fix anchor test error after installing rust?

I installed rust on Ubuntu and checked that version but there's rustc version error.
myunixx#LAPTOP-JSMKVSS3:~$ rustup --version
rustup 1.24.3 (ce5817a94 2021-05-31)
info: This is the version for the rustup toolchain manager, not the rustc compiler.
info: The currently active `rustc` version is `(error reading rustc version)`
I need 'rustc' to use anchor test. But I can't use it due to this error. I've reinstalled rust but there's no change. How can i fix this problem?
myunixx#LAPTOP-JSMKVSS3:~/myepicproject$ anchor test
Failed to obtain package metadata: `cargo metadata` exited with an error: error: process didn't exit successfully: `rustc -vV` (exit status: 127)
--- stderr
/home/myunixx/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin/rustc: error while loading shared libraries: /home/myunixx/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/bin/../lib/libstd-7c582493123fc1dd.so: file too short
It looks like there was an issue installing rustc, even though you have rustup. A few things you can try:
maybe Rust can fix itself: run rustup update
explicitly add a toolchain: run rustup toolchain install stable
reinstall rustup: run rustup self uninstall and then go back through the instructions at https://www.rust-lang.org/tools/install
More information about rustup at its book:
https://rust-lang.github.io/rustup/installation/index.html

some error failed to run custom build command for `librocksdb-sys v6.11.4`

I tried to create my first substrate chain. Create Your First Substrate Chain
But I got some error while compiling substrate.
failed to run custom build command for librocksdb-sys v6.11.4
Does anybody know how to fix this problem?
You need to install additional library:
sudo apt install clang should help.
sudo apt-get update
sudo apt install make clang pkg-config libssl-dev
This should do the trick.
Reference: https://github.com/paritytech/polkadot/issues/65
From #apopiak
Are you on Apple M1? If, so there are currently issues with building rocksdb there. See here an approach: vikiival.medium.com/run-substrate-on-apple-m1-a2699743fae8
Also others have reported needing to:
You need clone the rust-rocksdb repo and checkout the commit listed here: https://github.com/substrate-developer-hub/substrate-node-template/issues/122 then you can create a config.toml file in your .cargo folder in your home directory and add a path to that cloned repo
You had better update cargo to the nightly version and then try it.
If it keep in stuck error try comment commands, you may will need to study link.
#rustup component add --toolchain=nightly rust-src rustfmt
rustup target add wasm32-unknown-unknown
#apt-get install llvm clang linux-headers-"$(uname -r)" #
apt install llvm clang
cargo build --release
#cargo fix --allow-dirty #cargo fix --edition
#lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 20.04
Codename: focal
#ldconfig --version
ldconfig (Ubuntu GLIBC 2.31-0ubuntu9.2) 2.31
#cargo --version
cargo 1.60.0-nightly (25fcb13 2022-02-01)
#rustc --version
rustc 1.60.0-nightly (f624427f8 2022-02-06)
#rustup show
Default host: x86_64-unknown-linux-gnu
rustup home: /root/.rustup
installed targets for active toolchain
--------------------------------------
wasm32-unknown-unknown
x86_64-unknown-linux-gnu
active toolchain
----------------
nightly-x86_64-unknown-linux-gnu (default)
rustc 1.60.0-nightly (f624427f8 2022-02-06)
#ArmanRiazi.blockchain#Substrate#Dr.GavinWood
For details:
Walk-Through/Substrate/NodeSetup
You need to update the to this version: "6.20.3"
checksum = "c309a9d2470844aceb9a4a098cf5286154d20596868b75a6b36357d2bb9ca25d"
am running on M1!

Cross-compiling Rust's SerialPort crate

I am developing my Rust project on Ubuntu 20.04.2 LTS 64bit. I have setup the project to compile for the host architecture (using cargo build) and to cross-compile for the target archicture of ARM 64bit (using cargo build --target=aarch64-unknown-linux-gnu). The project has been cross-compiling fine up until now. On the target hardware platform there are serial ports that the application will be interacting with so I have added the Serial Port crate to my project. The project still compiles fine for the Ubuntu host architecture but I can no longer get it to cross-compile for the aarch64 taget.
I have added the target to rustup:
$ rustup target list
...
aarch64-fuchsia
aarch64-linux-android
aarch64-pc-windows-msvc
aarch64-unknown-linux-gnu (installed)
aarch64-unknown-linux-musl
aarch64-unknown-none
aarch64-unknown-none-softfloat
...
And I have installed the toolchain to rustup:
$ rustup toolchain list
stable-aarch64-unknown-linux-gnu
stable-x86_64-unknown-linux-gnu (default)
When I run the cargo build command of cargo build --target=aarch64-unknown-linux-gnu I get the following error during compiling:
$ cargo build --target=aarch64-unknown-linux-gnu
Compiling libudev-sys v0.1.4
error: failed to run custom build command for `libudev-sys v0.1.4`
Caused by:
process didn't exit successfully: `/mnt/hgfs/trunk/src/application/target/debug/build/libudev-sys-c6234f1891f55461/build-script-build` (exit code: 101)
--- stdout
cargo:rerun-if-env-changed=LIBUDEV_NO_PKG_CONFIG
cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS_aarch64-unknown-linux-gnu
cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS_aarch64_unknown_linux_gnu
cargo:rerun-if-env-changed=TARGET_PKG_CONFIG_ALLOW_CROSS
cargo:rerun-if-env-changed=PKG_CONFIG_ALLOW_CROSS
cargo:rerun-if-env-changed=PKG_CONFIG_aarch64-unknown-linux-gnu
cargo:rerun-if-env-changed=PKG_CONFIG_aarch64_unknown_linux_gnu
cargo:rerun-if-env-changed=TARGET_PKG_CONFIG
cargo:rerun-if-env-changed=PKG_CONFIG
cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_aarch64-unknown-linux-gnu
cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR_aarch64_unknown_linux_gnu
cargo:rerun-if-env-changed=TARGET_PKG_CONFIG_SYSROOT_DIR
cargo:rerun-if-env-changed=PKG_CONFIG_SYSROOT_DIR
--- stderr
thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: "pkg-config has not been configured to support cross-compilation.\n\n Install a sysroot for the target platform and configure it via\n PKG_CONFIG_SYSROOT_DIR and PKG_CONFIG_PATH, or install a\n cross-compiling wrapper for pkg-config and set it via\n PKG_CONFIG environment variable."', /home/nocker/.cargo/registry/src/github.com-1ecc6299db9ec823/libudev-sys-0.1.4/build.rs:38:41
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
warning: build failed, waiting for other jobs to finish...
error: build failed
I have installed pkg-config and libudev-dev. From the terminal I can get this output to confirm that pkg-config is installed:
$ pkg-config --version
0.29.1
but when I try to check that libudev is installed I get an error response:
$ libudev
libudev: command not found
$ libudev-dev
libudev-dev: command not found
When I try to install libudev again I get:
$ sudo apt install libudev-dev
Reading package lists... Done
Building dependency tree
Reading state information... Done
libudev-dev is already the newest version (245.4-4ubuntu3.4).
0 upgraded, 0 newly installed, 0 to remove and 15 not upgraded.
When I try to install libudev-sys I get:
$ sudo apt install libudev-sys
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package libudev-sys
I'm suspecting the reason that I cannot cross-compile is because of libudev but cannot figure this out. I have been trying to research how to solve this issue for a few days now but no luck with a solution. Any assistance or direction will be greatly appreciated. TIA.
If you are not dependent on some extra features you can disable the default libudev feature. Adapt the Cargo.toml this way:
serialport = {version = "4.0.1", default-features = false}
See also the description here: https://crates.io/crates/serialport
Otherwise you have to install a sysroot or wrapper. But I was not able to figure out how to do this (the solution above works fine for me). The error message I got is a little bit more meaningful:
pkg-config has not been configured to support cross-compilation.
Install a sysroot for the target platform and configure it via
PKG_CONFIG_SYSROOT_DIR and PKG_CONFIG_PATH, or install a
cross-compiling wrapper for pkg-config and set it via PKG_CONFIG
environment variable.

Linker cc not found when cross-compiling simple crate on Travis CI

As part of one of my projects, I have to cross-compile a Rust crate from x86_64 to i686 on Linux. I'm currently using Travis CI for this, with a simple Hello World crate (the default binary crate). My Travis CI configuration for the relevant matrix entry is:
# ...
matrix:
include:
# ...
- os: linux
rust: 1.30.0
before_script:
- sudo apt-get update
- sudo apt-get install -y libc6-dev:i386
env: TARGET=i686-unknown-linux-gnu
# ...
script:
- rustup target install $TARGET
- cargo build --release --target=$TARGET
Unfortunately, when I push this configuration to Travis CI, I get a build error:
$ cargo build --release --target=$TARGET
Compiling test-rust-deploy-releases v0.1.0 (/home/travis/build/arnavb/test-rust-deploy-releases)
error: linker `cc` not found
|
= note: No such file or directory (os error 2)
error: aborting due to previous error
error: Could not compile `test-rust-deploy-releases`.
To learn more, run the command again with --verbose.
The command "cargo build --release --target=$TARGET" exited with 101.
How do I fix this?
Well, after experimenting and more googling, I changed my apt install command to:
sudo apt-get install -y gcc-4.8 cpp-4.8 gcc-multilib
(The first two are unmet dependencies of the third, which had to be manually installed).
Now the build runs properly.

Haskell SDL-mixer compilation error

I am trying to install the SDL-mixer haskell package by using "cabal install sdl-mixer".
When I do so, it gives the error
Resolving dependencies...
[1 of 1] Compiling Main ( /tmp/SDL-mixer-0.6.1-10381/SDL-mixer-0.6.1/Setup.lhs, /tmp/SDL-mixer-0.6.1-10381/SDL-mixer-0.6.1/dist/setup/Main.o )
Linking /tmp/SDL-mixer-0.6.1-10381/SDL-mixer-0.6.1/dist/setup/setup ...
Configuring SDL-mixer-0.6.1...
configure: WARNING: unrecognized options: --with-compiler, --with-gcc
checking for sdl-config... /usr/bin/sdl-config
checking for gcc... gcc
checking whether the C compiler works... no
configure: error: in `/tmp/SDL-mixer-0.6.1-10381/SDL-mixer-0.6.1':
configure: error: C compiler cannot create executables
See `config.log' for more details.
Failed to install SDL-mixer-0.6.1
cabal: Error: some packages failed to install:
SDL-mixer-0.6.1 failed during the configure step. The exception was:
ExitFailure 77
If it makes a difference, I am on Arch Linux. How do I install this package?
make sure you have installed libsdl-mixer as a prerequisite.
Got the same symptoms on package network, on ubuntu 12.04. It was caused by /usr/bin/ld being gold instead of ld.bfd. Passing --with-ld=ld.bfd is apparently not enough for some packages.
Workaround:
mkdir /tmp/ld_override
ln -s /usr/bin/ld.bfd /tmp/ld_override/ld
PATH=/tmp/ld_override:$PATH cabal install ...
I try this, and it works for me. But I donnot know the reason :-)
brew install sdl_mixer
Then try
cabal install SDL-mixer

Resources