Gcc 从cygwin64编译32位代码

Gcc 从cygwin64编译32位代码,gcc,cygwin,32bit-64bit,windows-7-x64,Gcc,Cygwin,32bit 64bit,Windows 7 X64,我使用gcc开发工具在win7-64上安装了Cygwin64,我注意到它生成64位二进制文件。(哦,这并不奇怪:o)有没有办法让它生成一些32位二进制文件 我正在编译适用于windows的socat工具,它是64位编译的。它正在工作,但我正在尝试使另一个版本适合XP-32 configure脚本似乎不支持-b32开关(我必须从中看到ming64,如果我尝试在CFLAGS中为configure指定-m32开关,则失败: $ CFLAGS=-m32 ./configure checking whic

我使用gcc开发工具在win7-64上安装了Cygwin64,我注意到它生成64位二进制文件。(哦,这并不奇怪:o)有没有办法让它生成一些32位二进制文件

我正在编译适用于windows的socat工具,它是64位编译的。它正在工作,但我正在尝试使另一个版本适合XP-32

configure
脚本似乎不支持
-b32
开关(我必须从中看到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无法编译32位的简单
hello.c
程序:

#include <stdio.h>

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

Cygwin提供包含Cygwin到Cygwin跨工具链的包。有用于从64位Cygwin构建32位的
cygwin32-*
包和用于从32位Cygwin构建64位的
cygwin64-*


我从未使用过它们,但我认为它们的工作方式与任何跨工具链的工作方式几乎相同,因此您应该将正确的
--host
--build
参数传递给
/configure
步骤。

Cygwin提供了包含跨工具链的Cygwin到Cygwin的包。有
cygwin32-*
包用于从64位Cygwin和
cygwin64-*
用于从32位Cygwin构建64位的软件包


我从未使用过它们,但我认为它们的工作原理与任何交叉工具链差不多,因此您应该将正确的
--host
--build
参数传递到
/configure
步骤。

将-m32添加到编译器中并不会使它选择正确的库。您应该检查是否有i686 pc cygwin gcc编译器insta。要使用该编译器,您必须执行以下操作:

./configure--target=i686 pc cygwin


希望有帮助:-)

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

./configure--target=i686 pc cygwin


希望有帮助:-)

配置是自动工具的一部分,与原始问题无关。有两个32位运行时环境可以为其构建C程序。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程序,请使用export CC从cygwin64 shell中选择c编译器和运行时,或者只执行c编译器,默认生成输出如下面的“make hello”所示:

3) 您将注意到,由于32位的Cygwin运行时不在路径中,所以实际上没有发生任何事情。因此,将它添加到路径中,它将正确执行

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

$

4) 坐下来,喝一口咖啡,享受一下欢乐

配置是autotools的一部分,与原始问题无关。有两个32位运行时环境可以为其构建C程序。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程序,请使用export CC从cygwin64 shell中选择c编译器和运行时,或者只执行c编译器,默认生成输出如下面的“make hello”所示:

3) 您将注意到,由于32位的Cygwin运行时不在路径中,所以实际上没有发生任何事情。因此,将它添加到路径中,它将正确执行

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

$

4) 坐下来,喝杯咖啡,庆幸一下

我已经安装了cygwin32-*软件包,交叉编译仍然不起作用。我怀疑工具链的部署有一个bug…@Powerslave,你的
/configure
行是什么?@Powerslave,你到底是什么意思?@jacrate你只要直接调用
i686-w64-mingw32-*.exe
(其中
*
,例如
gcc
),它就会在Cygwin64环境中愉快地编译到Win32。当然,先决条件是安装
cygwin32-*
packages.i686-pc-cygwin-gcc.exe(cygwin32)、i686-w64-mingw32-gcc.exe(mingw32)。我已经安装了cygwin32-*包,交叉编译仍然无法工作。我怀疑工具链的部署有一个bug…@Powerslave,你的
/configure
行是什么?@Powerslave,你到底是什么意思?@jacrate你只要直接调用
i686-w64-mingw32-*.exe
(其中
*
,例如
gcc
),它就会在Cygwin64环境中愉快地编译到Win32。当然,先决条件是安装
cygwin32-*
软件包。i686-pc-cygwin-gcc.exe(cygwin32)、i686-w64-mingw32-gcc.exe(mingw32)。这个答案不完整。您从何处运行/配置?从shell中,我得到以下信息:-bash:./configure:没有这样的文件或目录通常是configure脚本
$ export PATH=/usr/i686-pc-cygwin/sys-root/usr/bin:$PATH
$ ./hello
Hello, world!

$