为 ARM 交叉编译 Rust 程序时的 ALSA 链接
ALSA linking when cross-compiling Rust program for ARM
我正在尝试交叉编译一个简单的 Rust 程序,以在 Raspberry Pi 零上使用 Docker 容器内的 wavy crate 上的 ALSA 驱动程序录制声音,该容器具有 libasound-dev
库已安装。然而,linker 抱怨:
note: /opt/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/../lib/gcc/arm-linux-gnueabihf/4.8.3/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lasound
collect2: error: ld returned 1 exit status
Cargo 似乎要求 rustc link 动态地使用参数 -Bdynamic" "-lasound"
对抗 asound 库。我如何告诉 Cargo 在哪里寻找这些 ALSA 库?
更新: 我将以下内容添加到我的 Cargo.toml 文件中,并将 --features "alsa-backend"
添加到我的 cargo build
命令中,这似乎已经取得了进展构建:
[features]
alsa-backend = ["alsa"]
[dependencies]
alsa = { version = "0.2.1", optional = true }
它现在抛出:
note: /usr/lib/x86_64-linux-gnu/libasound.so: file not recognized: File format not recognized
collect2: error: ld returned 1 exit status
好的,所以它是 link针对 libasound.so 的 x86_64 版本。我在 Docker 容器中输入了 dpkg -L libasound-dev
,实际上,它列出了 /usr/lib/x86_64-linux-gnu/libasound.so
而不是 ARM 版本。
如何让 Raspbian Docker 容器针对 libasound.so
的 ARM 版本 link?
解决方案:
- 将 libasound-dev 的 armhf 版本安装到您的 Raspbian docker 图像:
apt-get install libasound-dev -y
apt-get install libasound-dev:armhf -y
(如果你只安装libasound-dev:armhf
,它会报错alsa-sys
链接器错误。)
- 添加
alsa
依赖到Cargo.toml:
[dependencies]
alsa = { version = "0.2.1", optional = true }
wavy = { path = "./wavy" }
- 在Cargo.toml中设置
alsa-backend
标志:
[features]
alsa-backend = ["alsa"]
将--features "alsa-backend"
传递给cargo build --target arm-unknown-linux-gnueabihf
(应应用目标)
告诉rustc使用.cargo/config
中的armhf版本:
[build]
[target.arm-unknown-linux-gnueabihf.libasound]
linker = "arm-linux-gnueabihf-gcc"
rustc-link-lib = ["libasound"]
rustc-link-search = ["/usr/lib/arm-linux-gnueabihf"]
(根据它链接的顺序,它可能会尝试使用 x86 版本而不是 armhf 版本。)
我正在尝试交叉编译一个简单的 Rust 程序,以在 Raspberry Pi 零上使用 Docker 容器内的 wavy crate 上的 ALSA 驱动程序录制声音,该容器具有 libasound-dev
库已安装。然而,linker 抱怨:
note: /opt/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/../lib/gcc/arm-linux-gnueabihf/4.8.3/../../../../arm-linux-gnueabihf/bin/ld: cannot find -lasound
collect2: error: ld returned 1 exit status
Cargo 似乎要求 rustc link 动态地使用参数 -Bdynamic" "-lasound"
对抗 asound 库。我如何告诉 Cargo 在哪里寻找这些 ALSA 库?
更新: 我将以下内容添加到我的 Cargo.toml 文件中,并将 --features "alsa-backend"
添加到我的 cargo build
命令中,这似乎已经取得了进展构建:
[features]
alsa-backend = ["alsa"]
[dependencies]
alsa = { version = "0.2.1", optional = true }
它现在抛出:
note: /usr/lib/x86_64-linux-gnu/libasound.so: file not recognized: File format not recognized
collect2: error: ld returned 1 exit status
好的,所以它是 link针对 libasound.so 的 x86_64 版本。我在 Docker 容器中输入了 dpkg -L libasound-dev
,实际上,它列出了 /usr/lib/x86_64-linux-gnu/libasound.so
而不是 ARM 版本。
如何让 Raspbian Docker 容器针对 libasound.so
的 ARM 版本 link?
解决方案:
- 将 libasound-dev 的 armhf 版本安装到您的 Raspbian docker 图像:
apt-get install libasound-dev -y
apt-get install libasound-dev:armhf -y
(如果你只安装libasound-dev:armhf
,它会报错alsa-sys
链接器错误。)
- 添加
alsa
依赖到Cargo.toml:
[dependencies]
alsa = { version = "0.2.1", optional = true }
wavy = { path = "./wavy" }
- 在Cargo.toml中设置
alsa-backend
标志:
[features]
alsa-backend = ["alsa"]
将
--features "alsa-backend"
传递给cargo build --target arm-unknown-linux-gnueabihf
(应应用目标)告诉rustc使用
.cargo/config
中的armhf版本:
[build]
[target.arm-unknown-linux-gnueabihf.libasound]
linker = "arm-linux-gnueabihf-gcc"
rustc-link-lib = ["libasound"]
rustc-link-search = ["/usr/lib/arm-linux-gnueabihf"]
(根据它链接的顺序,它可能会尝试使用 x86 版本而不是 armhf 版本。)