【问题标题】:compile 32bit code from cygwin64从 cygwin64 编译 32 位代码
【发布时间】:2015-05-08 08:48:02
【问题描述】:

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

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

configure 脚本似乎不支持 -b 32 开关(我必须从 this thread 看到 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;
}

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

【问题讨论】:

标签: gcc cygwin 32bit-64bit windows-7-x64


【解决方案1】:

configure 是 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 输出如下所示“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
  • 看起来你需要为 llvm 使用 mingw64-686-clang。目前看来 CYGWIN32 中不支持 llvm。
【解决方案2】:

Cygwin 提供包含 cygwin-to-cygwin 交叉工具链的软件包。有 cygwin32-* 包用于从 64 位 Cygwin 构建 32 位和 cygwin64-* 包用于从 32 位 Cygwin 构建 64 位。

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

【讨论】:

  • 我安装了 cygwin32-* 软件包,但交叉编译仍然无法工作。我怀疑工具链的部署存在错误...
  • @Powerslave,你的./configure 线路是什么?
  • @Powerslave,你到底是什么意思?
  • @jacerate 你只需直接调用i686-w64-mingw32-*.exe* 将是,例如gcc),它会很高兴地在 Cygwin64 环境中编译为 Win32。当然,前提条件是安装了 cygwin32-* 软件包。
  • i686-pc-cygwin-gcc.exe (Cygwin32), i686-w64-mingw32-gcc.exe (Mingw32)。
【解决方案3】:

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

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

希望对你有帮助:-)

【讨论】:

  • 这个答案不完整。你从哪里运行 ./configure?从外壳,我得到这个:-bash: ./configure: No such file or directory
  • configure 脚本通常与您尝试编译的源代码一起提供。提出的问题专门针对配置脚本。如何解压源代码并定位配置脚本不在这个问题的范围内,恕我直言。
猜你喜欢
  • 2013-06-25
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
相关资源
最近更新 更多