使用automake配置脚本在64位Linux上构建32位代码?

60

我使用的是64位系统,但是想要一组32位二进制文件。我需要在configure脚本中传递什么选项来生成一个32位/x86的makefile?


加一。我正在尝试为Solaris构建Git。uname -m返回i86pc。大约10个依赖库中除了一个都错误地检测到了平台。只有OpenSSL正确地将其识别为x86_64。 - jww
5个回答

74

将以下参数传递给configure脚本使我能够在64位Linux上构建32位库

./configure --build=i686-pc-linux-gnu CFLAGS=-m32 CXXFLAGS=-m32 LDFLAGS=-m32

对我不起作用 :( 请在https://dev59.com/LmYr5IYBdhLWcg3wTYm4帮助我 - m93a
4
尝试构建一个库时,出现了错误信息“configure: error: C++ compiler cannot create executables”,我无法成功。 - Craig McQueen
2
这个答案不完整,这就是为什么有时候会出现“编译器无法创建可执行文件”的错误。请查看我在同一主题中的答案。 - volpato

54

杰克的回答不完整。

你需要编译器/库的32位支持。在像Ubuntu这样的发行版中,你需要做的是安装gcc-multilib和/或g++-multilib软件包:

sudo apt-get install gcc-multilib g++-multilib

那么您可以按照您说的那样调用配置,指定32位主机并传递32位编译标志:

./configure --host=i686-linux-gnu "CFLAGS=-m32" "CXXFLAGS=-m32" "LDFLAGS=-m32"
如果您没有安装multilib,当传递-m32标志时,您将会得到如下错误:configure: error: C compiler cannot create executables

3
一些程序默认情况下会在amd64上编译32位代码(例如wine),可能还会编译64位代码,并且如果已安装multilib,则应该能够找到它。似乎OP并非如此。此外,Jack说对了一件事——应该使用“--build”而不是“--host”。只有在构建编译器时才应该使用“--host”。尽管如此,由于有很多人不读手册并编写使用“--host”而不是“--build”的脚本,因此它仍然有效,并且自动工具的开发者已经搞砸了足够多的东西。 - Jonathan Baldwin
Debian稳定版中不再存在*-multilib软件包。 - Braiam
我在 Debian Stretch 中仍然看到 g++-multilib。除此之外,您还需要启用32位运行时库,如 https://wiki.debian.org/Multiarch/HOWTO 中所述。该页面底部的命令 dpkg --add-architecture i386; apt-get install libstdc++6:i386 libgcc1:i386 zlib1g:i386 libncurses5:i386 是一个很好的起点。您现在可以根据需要安装额外的库,例如要构建需要 SSL 的东西,您可以使用 apt-get install libssl-dev:i386 - Michael Firth
@JonathanBaldwin ./configure --help 表示(由 autoconf 生成的脚本):系统类型: --build=BUILD 配置为在 BUILD 上构建 [猜测] --host=HOST 交叉编译以在 HOST 上运行程序 [BUILD] - real-or-random

8

我通过设置自定义编译器取得了更好的成功。这样,所有的配置测试,甚至使用自定义CFLAGS的测试都能正常工作:

./configure CC="gcc -m32" CXX="g++ -m32"

当然,你仍然需要应用程序所使用的所有库的32位版本,因此任何关于缺少库的错误都是指32位版本。


4
假设使用gcc/g++编译器:
CPPFLAGS=-m32 ./configure ...

1
谢谢你的回答。配置脚本仍将构建系统类型和主机系统类型设置为x86_64-unknown-linux-gnu。你知道如何覆盖这些吗? - Jack Nock

1

如果您有的话,另一种实现上述内容的方法是使用专用的x86编译器。这样,配置行将如下所示(我将x86工具命名为“<toolname>-x86”):

CC="/path/to/c/compiler/gcc-x86" CXX="path/to/cpp/compiler/g++-x86" LD="path/to/linker/ld-x86" ./configure

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