使用 automake 配置脚本在 64 位 Linux 上构建 32 位?
Posted
技术标签:
【中文标题】使用 automake 配置脚本在 64 位 Linux 上构建 32 位?【英文标题】:Build 32bit on 64 bit Linux using an automake configure script? 【发布时间】:2011-03-16 18:29:04 【问题描述】:我使用的是 64 位系统,但需要一组 32 位二进制文件。我必须将哪些选项传递给配置脚本以生成 32 位/x86 生成文件?
【问题讨论】:
加一。我正在尝试为 Solaris 构建 Git。uname -m
返回i86pc
。除了 10 个左右的依赖库中的一个之外,其他所有库都错误地检测到了该平台。只有 OpenSSL 正确地将其识别为 x86_64。
【参考方案1】:
将以下参数传递给配置脚本允许我在 64 位 Linux 上构建 32 位库
./configure --build=i686-pc-linux-gnu CFLAGS=-m32 CXXFLAGS=-m32 LDFLAGS=-m32
【讨论】:
对我不起作用 :( 请通过 ***.com/questions/13780319/… 帮助我 尝试构建库时它对我不起作用。它给了我消息configure: error: C++ compiler cannot create executables
。
此答案不完整,这就是为什么有时您会收到“编译器无法创建可执行文件”错误的原因。在同一线程中查看我的答案【参考方案2】:
杰克的回答不完整。
您需要编译器/libc 支持才能进行 32 位编译。在 Ubuntu 等一些发行版中,您需要做的是安装软件包 gcc-multilib
和/或 g++-multilib
:
sudo apt-get install gcc-multilib g++-multilib
然后你可以按照你说的调用configure,指定一个32位主机并传递32位编译标志:
./configure --host=i686-linux-gnu "CFLAGS=-m32" "CXXFLAGS=-m32" "LDFLAGS=-m32"
如果您没有安装 multilib,在传递 -m32
标志时会收到类似 configure: error: C compiler cannot create executables
的错误。
【讨论】:
有些程序默认在 amd64 上编译 32 位(例如 wine),可能除了 64 位之外,如果安装了 multilib,应该能够找到。 OP似乎并非如此。此外,杰克在一件事上是对的——应该是--build
,而不是--host
。当且仅当您正在构建编译器时,才应使用--host
。它仍然有效,因为有很多人不使用 RTFM 并编写使用 --host
而不是 --build
的脚本,而且 autotools 人已经破坏了足够多的东西。
Debian stable 中不再存在 *-multilib 包。
我仍然在 Debian Stretch 中看到 g++-multilib
。除此之外,您还需要启用 32 位运行时库,如 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
。
@JonathanBaldwin ./configure --help
说(对于 autoconf 生成的脚本):System types: --build=BUILD configure for building on BUILD [guessed] --host=HOST cross-compile to build programs to run on HOST [BUILD]
【参考方案3】:
我通过设置自定义编译器获得了更好的成功。这样,所有的配置测试,甚至是使用自定义 CFLAGS 的测试,都能正常工作:
./configure CC="gcc -m32" CXX="g++ -m32"
当然,您仍然需要应用程序使用的所有库的 32 位版本,因此有关缺少库的任何错误都是指 32 位版本。
【讨论】:
【参考方案4】:假设 gcc/g++:
CPPFLAGS=-m32 ./configure ...
【讨论】:
感谢您的回答。配置脚本仍然将构建系统类型和主机系统类型设置为 x86_64-unknown-linux-gnu。你知道如何覆盖这些吗?【参考方案5】:上述方法的另一种方法是(如果有的话)使用专用的 x86 编译器。然后配置行将是这样的(我以模式“
CC="/path/to/c/compiler/gcc-x86" CXX="path/to/cpp/compiler/g++-x86" LD="path/to/linker/ld-x86" ./configure
【讨论】:
以上是关于使用 automake 配置脚本在 64 位 Linux 上构建 32 位?的主要内容,如果未能解决你的问题,请参考以下文章
使用 AM_INIT_AUTOMAKE 参数并配置脚本命令行参数
sh 脚本只显示工具的版本,如果它们安装在系统中。 (clang make automake autoconf cmake)