質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
ビルド

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

1回答

1311閲覧

lib-crateのクロスビルドをするとstdが存在しないエラーを解決したい

v_v

総合スコア47

ビルド

ソースコードを単体で実行可能なソフトウェアへ変換する過程をビルド(build)と呼びます

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

0クリップ

投稿2021/04/04 13:16

編集2021/04/04 13:22

作業環境

Windows 10(WSL2 Ubuntu 18.04-2)

バージョン

cargo 1.53.0-nightly (3c44c3c4b 2021-03-31) release: 1.53.0 commit-hash: 3c44c3c4b7900b8b13c85ead25ccaa8abb7d8989 commit-date: 2021-03-31
rustc 1.53.0-nightly (d474075a8 2021-04-01) binary: rustc commit-hash: d474075a8f28ae9a410e95d849d009006db4b176 commit-date: 2021-04-01 host: x86_64-unknown-linux-gnu release: 1.53.0-nightly LLVM version: 12.0.0

発生している事象

以下のような内容のlibクレートを下記カスタムターゲットでビルドしました。
クレート生成時のコマンド:cargo new --lib test

lib.rs

rust

1#![feature(restricted_std)] 2// 以下実装なし

ファイル名:x86_64-unknown-none.json

json

1{ 2 "llvm-target": "x86_64-unknown-none", 3 "data-layout": "e-m:e-i64:64-f80:128-n8:16:32:64-S128", 4 "arch": "x86_64", 5 "target-endian": "little", 6 "target-pointer-width": "64", 7 "target-c-int-width": "32", 8 "os": "none", 9 "executables": true, 10 "linker-flavor": "ld.lld", 11 "linker": "rust-lld", 12 "panic-strategy": "abort", 13 "disable-redzone": true, 14 "features": "-mmx,-sse,+soft-float" 15}

build-stdが指定されるように.cargo/configを以下のとおり設定しています。

toml

1[target.x86_64-unknown-none] 2rustflags = [ 3 # Build Options 4 "-C", "relocation-model=static", 5] 6 7[build] 8target = "x86_64-unknown-none.json" 9 10[unstable] 11build-std = ["core", "compiler_builtins", "alloc"]

ビルドコマンドとエラーは以下のとおりです。

/mnt/d/Users/user/Documents/vmShare/testCodes/bare/common$ cargo build Compiling compiler_builtins v0.1.39 Compiling core v0.0.0 (/home/user/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core) Compiling rustc-std-workspace-core v1.99.0 (/home/user/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/rustc-std-workspace-core) Compiling alloc v0.0.0 (/home/user/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/alloc) Compiling common v0.1.0 (/mnt/d/Users/user/Documents/vmShare/testCodes/bare/common) error[E0463]: can't find crate for `std` | = note: the `x86_64-unknown-none-17747633082801976854` target may not be installed error: aborting due to previous error For more information about this error, try `rustc --explain E0463`. error: could not compile `common` To learn more, run the command again with --verbose. warning: build failed, waiting for other jobs to finish... error: build failed

ただし、-Zbuild-stdオプションを付けるとビルドが通ります。

疑問

  1. -Zbuild-stdは .cargo/config または .cargo/config.toml で置き換えられないのか(バイナリクレートではどちらの方法でも正しくビルドできた)
  2. なぜ、-Zbuild-stdを付けた途端にビルドが正しく走るのか(.cargo/configが正しく置き換えられていれば、こちらも通らないはず)

Rustの仕様が良く理解できていないので、上記2点質問させてください。
以上です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

質問取り下げます(解決済み)

  1. そもそもlibクレート単体では .cargo/config.toml の効果は出ない
  2. ライブラリクレートはバイナリクレートの.cargo/config.tomlやCargo.toml及びカスタムクレート(x86_64-unknown-none.json)の設定が継承されてビルドされる。
  3. そのため、単体ではビルドが失敗する(投稿時の試行内容)
  4. バイナリクレートが#[no_std]前提の場合は、ライブラリクレートのソースlib.rsの先頭は#[no_std]でなければならない。(#![feature(restricted_std)]を付けている時点で誤り)

上記4点の改善により解決しました。

投稿2021/04/04 13:52

編集2021/04/04 13:54
v_v

総合スコア47

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問