![如何在 x86-64 机器上构建 i386 目标的 rpm?](https://linux22.com/image/49764/%E5%A6%82%E4%BD%95%E5%9C%A8%20x86-64%20%E6%9C%BA%E5%99%A8%E4%B8%8A%E6%9E%84%E5%BB%BA%20i386%20%E7%9B%AE%E6%A0%87%E7%9A%84%20rpm%EF%BC%9F.png)
我正在使用以下命令构建 rpm rpmbuild
:
rpmbuild -bb --root <DIRECTORY> --target i386 --define "_topdir <DIRECTORY>" <specfile>.spec
当我使用我的 SLED 10 SP3 x86 机器时,它运行成功。但在我的 SLES 10 SP3 x64 虚拟机上,出现以下错误:
error: No compatible architectures found for build
最初我没有使用--target
选项,它仍然在 x86 机器上运行,但在 x64 机器上也存在同样的错误。
请帮我解决这个错误
答案1
既然你正在使用“-bb”标志,这意味着您正在构建二进制所以你不需要安装其他架构的编译器。
只需删除规范文件中的“Buildarch”行并从命令行传递它即可
--target i386
或者
--target x86_64
它应该为您创建转速。
答案2
来自 rpm、spec 文件和 rpmbuild 的 Fedora 文档:
The --target option sets the target architecture at build time. Chapter 3,
Using RPM covers how you can use the --ignoreos and --ignorearch options
when installing RPMs to ignore the operating system and architecture that
is flagged within the RPM. Of course, this works only if you are installing
on a compatible architecture.
On the surface level, the --target option overrides some of the macros in
the spec file, %_target, %_target_arch, and %_target_os. This flags the RPM
for the new target platform.
Under the covers, setting the architecture macros is not enough. You really
cannot create a PowerPC executable, for example, on an Intel-architecture
machine, unless you have a PowerPC cross compiler, a compiler that can make
PowerPC executables.
http://docs.fedoraproject.org/en-US/Fedora_Draft_Documentation/0.1/html/RPM_Guide/ch-rpmbuild.html
因此,正如它所说,请确保您安装了附加编译器(例如gcc.i686
& gcc.x86_64
)。
答案3
最简单的方法是启动 x86 VM 并在其上进行构建,然后将 i386 或 i686 rpm 复制到 x86_64 计算机。
答案4
你要:--target i386-redhat-linux
glibc.i686
但是,只有当您安装了和glibc-devel.i686
且必须有一个能够同时生成 32 位和 64 位代码的多架构编译器时,这才有效。
Red Hat 提供的 GCC 被故意阉割为无法做到这一点,尽管 GCC 完全有能力做到这一点,并且在真正的 UNIX 操作系统(如 AIX、Solaris、IRIX 甚至 PPC)上毫不费力地做到这一点。基于红帽系统。
因此,为了能够做到这一点,并且如果(且仅当!)您希望使用 GCC 能够做到这一点,您必须构建并打包您自己的 GCC 版本,并显式启用多架构构建,GCC./configure
如果(且仅当!)它检测到 GCC 是在 GNU/Linux 上构建的,则默认情况下脚本不会执行此操作。
另一种选择是安装和使用适用于 GNU/Linux 的 Intel、PGI 或 Sun Studio 编译器,但这些编译器更加迂腐且符合标准,并且不能容忍许多 GCC 不可移植的语法结构。