Spotifyd,交叉编译为arm64

4

我正在尝试使用 cargo build --release --target aarch64-unknown-linux-gnu 命令为我的 aarch64 架构编译 Spotifyd,所有依赖项都已安装,到目前为止,编译工作正常。

然而,最后一步 (Compiling spotifyd v0.1.1 (file:///home/ubuntu/spotifyd)) 失败了,错误信息如下:

 = note: aarch64-linux-gnu-ld.gold: -Wl,--as-needed: unknown option
          aarch64-linux-gnu-ld.gold: use the --help option for usage information

我的cargo配置已设置为使用aarch64链接器:

/root/.cargo/config

[target.aarch64-unknown-linux-gnu]
linker = "aarch64-linux-gnu-ld.gold"

看起来在 aarch64-linux-gnu-ld.gold 中无法使用 -Wl,是否有其他替代方案可用于 aarch64-linux-gnu-ld.gold,或者是否可以从 cargo 中删除 -Wl 标志?

谢谢您的建议。


现在是amd64还是arm64?此外,将-Wl,xyz传递给链接器似乎很奇怪,因为该标志通常表示“将xyz转发给链接器”... - Siguza
arm64,-wl似乎由cargo自动传递... - user5827241
1个回答

2
链接器不接受“-Wl”作为选项,它是gcc编译器驱动程序的命令行参数。
gcc使用此选项将命令行参数传递给链接器,如果它被提供了“.o”(目标)文件,驱动程序gcc将调用链接器。
请参阅gcc文档3.14 链接选项
-Wl,option
将选项作为链接器的选项传递。如果选项包含逗号,则在逗号处将其拆分为多个选项。
请参阅以下任何解释(直接跳到底部):
Gentoo Wiki的“项目:质量保证/按需”中的“编译失败,无法识别的选项”部分。
请注意所使用的Binutils Gold Linker版本,例如,请参阅Bug 18859。始终检查错误报告,但是错误不是问题。
直接回答您最后的问题“我可以从cargo中删除-Wl吗”,是的,您可以这样做,但这是错误的做法;该命令会剥离未使用的代码。
此选项允许链接器忽略其命令行上提供的某些库(如果它们实际上没有被正在创建的共享库使用)。
您要做的是将链接器更改为aarch64-linux-gnu-gcc,然后链接应该可以工作。请参见martinhath在Reddit上的问题“交叉编译和链接器标志”。
因此,您需要进行以下更改:
/root/.cargo/config [target.aarch64-unknown-linux-gnu] linker = "aarch64-linux-gnu-gcc"

哇!非常感谢您的工作和深入研究!我当然会尝试! - user5827241
没问题。如果你想的话,可以查看 .configure 文件,找到链接器被检测到的位置,并确定为什么它选择直接调用链接器而不是编译器驱动程序 - 通常会使用扩展的检测例程来检测特定链接器的特定功能,完成后,随后的脚本应该根据这种方法进行调整。这是配置中的一个 bug,但不会损坏您的计算机或程序(一旦编辑了那个脚本)。在文档中提供的电子邮件地址或网站上提交错误报告是正确的方式。 - Rob
我现在正在与另一个问题(libasound)苦苦挣扎,但是你的答案对于这个问题是正确的。非常感谢! - user5827241

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接