从Cygwin64编译32位代码

9

我在win7-64上安装了带有gcc开发工具的Cygwin64,但我刚刚注意到它会生成64位二进制文件。(这也不奇怪:o)有什么办法可以让它生成一些32位二进制文件吗?

我正在为Windows编译socat工具,在64位编译版本中它运行良好,但我正在尝试制作另一个适用于XP-32的版本。

configure脚本似乎不支持-b 32开关(我必须从此线程中看到ming64有该选项),如果我尝试在CFLAGS中为configure指定-m32开关,则会失败:

$ CFLAGS=-m32 ./configure
checking which defines needed for makedepend...
checking for a BSD-compatible install... /usr/bin/install -c
checking for gcc... gcc
checking whether the C compiler works... no
configure: error: in `/cygdrive/c/dev/tools/nettools/socat/socat-2.0.0-b8':
configure: error: C compiler cannot create executables
See `config.log' for more details

您是否考虑安装Cygwin32,或者通过其他设置或Cygwin包来编译32位代码?

编辑:我发现我的cygwin64/gcc无法编译一个简单的hello.c 32位程序:

#include <stdio.h>

int main (int argc, char *argv[]){
    printf("Hello, world!\n");
    return 0;
}

使用gcc -o hello.exe hello.c命令可以完美运行,但是使用gcc -o hello.exe hello.c -m32命令会出错。

/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2//libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2//libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2//libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2//libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2//libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../libcygwin.a when searching for -lcygwin
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../libcygwin.a when searching for -lcygwin
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../libcygwin.a when searching for -lcygwin
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lcygwin
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: cannot find -ladvapi32
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lshell32
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: cannot find -luser32
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lkernel32
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2//libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2//libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/libgcc_s.dll.a when searching for -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lgcc_s
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2//libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2//libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2//libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-pc-cygwin/4.9.2/libgcc.a when searching for -lgcc
/usr/lib/gcc/x86_64-pc-cygwin/4.9.2/../../../../x86_64-pc-cygwin/bin/ld: cannot find -lgcc
collect2: error: ld returned 1 exit status

1
你也可以查看https://dev59.com/KLHma4cB1Zd3GeqPGyXE#54216105。 - CristiFati
4个回答

7

configure是autotools的一部分,与原始问题无关。您可以为C程序构建两个32位运行时环境。CYGWIN-32和MINGW32。我不会详细介绍它们之间的区别,但cygwin32程序与posix / Linux兼容(大多数情况下),因此我更喜欢这个环境。以下是如何在cygwin64安装中制作cygwin32应用程序的详细信息:

1)在cygwin64设置中安装cygwin32-gcc包和cygwin32-w32api-runtime包,如果您尚未执行此操作。这将安装c编译器i686-pc-cygwin-gcc和运行时cygwin1.dll,您需要使用它来测试您的程序(或者您可以在cygwin32安装中测试它)。

2)假设您要编译上面的hello.c程序,请从cygwin64 shell中选择C编译器和运行时,方法是使用export CC,或者只需执行默认make输出下方显示的C编译器“make hello”:

$ export CC=i686-pc-cygwin-gcc
$ make hello
i686-pc-cygwin-gcc     hello.c   -o hello
$ ./hello
$ *There is no output, program didn't work*

3) 请注意,由于32位Cygwin运行时不在路径中,因此实际上什么也没有发生。因此,请将其添加到路径中,它将正确执行。

$ export PATH=/usr/i686-pc-cygwin/sys-root/usr/bin:$PATH
$ ./hello
Hello, world!

$

4) 轻松一下,喝口咖啡,享受成功的喜悦


Kurt,有没有办法使用clang编译器而不是gcc来构建32位应用程序?当我运行Cygwin64安装程序时,我没有看到cygwin32-clangcygwin32-llvm - Danijel
看起来你需要使用mingw64-686-clang来编译LLVM。目前在CYGWIN32中似乎没有对LLVM的支持。 - Kurt Godwin

4

2022年12月更新

本主题中的所有其他解决方案都不再适用 !!!

显然,Cygwin已经没有安装32位编译器和必需库的软件包!

旧版"Cygwin32" (setup-x86.exe)只能通过向设置程序传递以下选项来安装,否则安装程序会立即终止并显示模糊的错误消息:

--allow-unsupported-windows

此外,由于32位安装包在“官方”镜像站点上已不再提供,因此我们必须手动使用Cygwin Time Machine镜像站点:
http://ctm.crouchingtigerhiddenfruitbat.org/pub/cygwin/circa/2022/11/23/063457 

通过这种方式,我们可以获得一个可工作的32位gcc和所有所需的库。

注意:Cygwin32可以与Cygwin64(在单独的目录中)并排安装,没有问题。


3

将-m32添加到编译器中并不能选择正确的库。您应该检查是否安装了i686-pc-cygwin-gcc编译器。要使用该编译器,您需要执行以下操作:

./configure --target=i686-pc-cygwin

希望这有所帮助 :-)


这个答案不完整。你从哪里运行./configure?从shell中,我得到了这个:-bash: ./configure: 没有那个文件或目录。 - Jay Elston
2
配置脚本通常随您尝试编译的源代码一起提供。所问的问题特别涉及配置脚本。如何解压源代码并找到配置脚本超出了这个问题的范围,依我看来。 - millibit
这是正确的,但你还需要指定 --build=i686-pc-cygwin,否则 configure 脚本会猜测错误。 - Noldorin

3
Cygwin提供包含Cygwin到Cygwin交叉工具链的软件包。有用于从64位Cygwin构建32位程序的“cygwin32-*”软件包,以及用于从32位Cygwin构建64位程序的“cygwin64-*”软件包。
我从未使用过它们,但我认为它们与任何交叉工具链基本相同,因此您应该在./configure步骤中传递正确的--host--build参数。

我已经安装了cygwin32-*软件包,但交叉编译仍然无法工作。我怀疑在工具链的部署中存在错误。 - Powerslave
@Powerslave,你的./configure命令是什么? - David Macek
@Powerslave,你确切的意思是什么? - jacerate
1
@jacerate,您只需直接调用i686-w64-mingw32-*.exe(其中*可以是gcc等),它将愉快地在Cygwin64环境下编译为Win32。当然,前提是已安装了cygwin32-*软件包。 - Powerslave
i686-pc-cygwin-gcc.exe(Cygwin32),i686-w64-mingw32-gcc.exe(Mingw32)。 - dns

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