与任何Nix发行版一样,Cygwin 64模拟器允许运行32 位可执行文件(只要它们兼容)。您只需要具备:
- 安装了正确的软件包
- 正确的.dll位于正确的位置(如您所提到的)-但手动复制它们(尤其是在系统位置)既不可扩展,也不保证系统之后可以正常工作
首先,您需要(至少)安装cygwin32软件包:

由于我没有您的32 位可执行文件(我不喜欢搜索下载、解包等...),我创建了一个小示例(为了使其运行,您还需要gcc工具链- 我有其他目的,但无论如何这与重现行为的问题无关。
代码.c:
#include <stdio.h>
int main() {
printf("\"void*\" is %d bits long.\n", sizeof(void*) * 8);
return 0;
}
输出:
[cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> ~/sopr.sh
### Set shorter prompt to better fit when pasted in StackOverflow (or other) pages ###
[064bit prompt]> uname -a
CYGWIN_NT-10.0 cfati-5510-0 2.11.2(0.329/5/3) 2018-11-08 14:34 x86_64 Cygwin
[064bit prompt]> ls
code.c
[064bit prompt]> x86_64-pc-cygwin-gcc.exe -o exe-gcc-064.exe code.c
[064bit prompt]> i686-pc-cygwin-gcc.exe -o exe-gcc-032.exe code.c -m32
[064bit prompt]> ls -al
total 433
drwxrwx---+ 1 Administrators None 0 Jan 16 12:45 .
drwxrwx---+ 1 Administrators None 0 Jan 16 10:33 ..
-rwxrwx---+ 1 Administrators None 118 Jan 16 10:39 code.c
-rwxrwxr-x+ 1 cfati None 151062 Jan 16 12:45 exe-gcc-032.exe
-rwxrwxr-x+ 1 cfati None 157755 Jan 16 12:45 exe-gcc-064.exe
[064bit prompt]>
[064bit prompt]> file exe-gcc-064.exe
exe-gcc-064.exe: PE32+ executable (console) x86-64, for MS Windows
[064bit prompt]> ldd exe-gcc-064.exe
ntdll.dll => /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffcaf990000)
KERNEL32.DLL => /cygdrive/c/WINDOWS/System32/KERNEL32.DLL (0x7ffcaf300000)
KERNELBASE.dll => /cygdrive/c/WINDOWS/System32/KERNELBASE.dll (0x7ffcabe60000)
cygwin1.dll => /usr/bin/cygwin1.dll (0x180040000)
[064bit prompt]> ./exe-gcc-064.exe
"void*" is 64 bits long.
[064bit prompt]>
[064bit prompt]> file exe-gcc-032.exe
exe-gcc-032.exe: PE32 executable (console) Intel 80386, for MS Windows
[064bit prompt]> ldd exe-gcc-032.exe
ntdll.dll => /cygdrive/c/WINDOWS/SYSTEM32/ntdll.dll (0x7ffcaf990000)
??? => ??? (0x77150000)
wow64.dll => /cygdrive/c/WINDOWS/System32/wow64.dll (0x7ffcaf800000)
wow64win.dll => /cygdrive/c/WINDOWS/System32/wow64win.dll (0x7ffcad570000)
[064bit prompt]> ./exe-gcc-032.exe
[064bit prompt]>
[064bit prompt]> echo $?
127
如您所见,我遇到了与exe-gcc-032.exe完全相同的问题。??? _ 依赖项是32 位 cygwin1.dll。让我们来探讨一下这个问题:
[064bit prompt]> find /usr -name cygwin1.dll
/usr/i686-pc-cygwin/sys-root/usr/bin/cygwin1.dll
/usr/bin/cygwin1.dll
[064bit prompt]> cygcheck -f /usr/bin/cygwin1.dll
cygwin-2.11.2-1
[064bit prompt]> file /usr/bin/cygwin1.dll
/usr/bin/cygwin1.dll: PE32+ executable (DLL) (console) x86-64, for MS Windows
[064bit prompt]>
[064bit prompt]> cygcheck -f /usr/i686-pc-cygwin/sys-root/usr/bin/cygwin1.dll
cygwin32-2.10.0-1
[064bit prompt]> file /usr/i686-pc-cygwin/sys-root/usr/bin/cygwin1.dll
/usr/i686-pc-cygwin/sys-root/usr/bin/cygwin1.dll: PE32 executable (DLL) (console) Intel 80386 (stripped to external PDB), for MS Windows
[064bit prompt]>
[064bit prompt]> echo ${PATH}
/usr/local/bin:/usr/bin:/cygdrive/c/Program Files (x86)/Common Files/Oracle/Java/javapath:/cygdrive/c/WINDOWS/system32:/cygdrive/c/WINDOWS:/cygdrive/c/WINDOWS/System32/Wbem:/cygdrive/c/WINDOWS/System32/>WindowsPowerShell/v1.0:/cygdrive/c/Install/x64/NVidia/GPU Computing Toolkit/CUDA/AllVers/bin:/cygdrive/c/Install/x64/NVidia/GPU Computing Toolkit/CUDA/AllVers/libnvvp:/cygdrive/c/Install/x86/Borland/Del>phi/7/>Bin:/cygdrive/c/Install/x86/Borland/Delphi/7/Projects/Bpl:/cygdrive/c/ProgramData/Oracle/Java/javapath:/cygdrive/c/Program Files (x86)/Intel/iCLS Client:/cygdrive/c/Program Files/Intel/iCLS Client:/cygd>rive/c/>Program Files (x86)/Intel/Intel(R) Management Engine Components/DAL:/cygdrive/c/Program Files/Intel/Intel(R) Management Engine Components/DAL:/cygdrive/c/Program Files (x86)/Intel/Intel(R) Management En>gine >Components/IPT:/cygdrive/c/Program Files/Intel/Intel(R) Management Engine Components/IPT:/cygdrive/c/Program Files (x86)/NVIDIA Corporation/PhysX/Common:/cygdrive/c/WINDOWS/System32/OpenSSH:/cygdrive/c/>Insta>ll/>x86/IVI Foundation/VISA/AllVers/WinNT/Bin:/cygdrive/c/Program Files/IVI Foundation/VISA/Win64/Bin:/cygdrive/c/Install/x86/IVI Foundation/VISA/AllVers/WinNT/Bin:/cygdrive/e/Work/Dev/Utils/cfati-5510-0/>windows:/cygdrive/c/Install/x64/NVidia/GPU Computing Toolkit/cuDNN/AllVers/bin:/cygdrive/c/Users/cfati/AppData/Local/Microsoft/WindowsApps:/cygdrive/c/Install/Qt/Qt/5.9.1/msvc2015/bin
因此,32 位 .dll存在(由上述软件包安装),但找不到,因为它的目录不在${PATH}中(由于内容长度,这不是立即可见的)。请注意,Cygwin在这种情况下不支持 LD_LIBRARY_PATH 。
显而易见的步骤是让系统知道这个.dll ,方法是在PATH中添加它的目录(在开头):
[064bit prompt]> export PATH=/usr/i686-pc-cygwin/sys-root/usr/bin:${PATH}
[064bit prompt]> ./exe-gcc-032.exe
"void*" is 32 bits long.
[064bit prompt]> ./exe-gcc-064.exe
"void*" is 64 bits long.
你去吧。
最后说明:
- (64 位)ldd是一个.exe(与Nix不同,它是一个脚本),不能优雅地处理32 位人工制品的依赖关系。不幸的是,cygwin32-binutils包没有提供不会有这个问题的32 位对应包,所以目前这已经是最好的了
- 您在运行.exe时可能会遇到一些问题,因为cygwin1.dll版本(rxvt-native.exe期望的版本和系统上存在的版本)之间可能存在差异。如果是这样,我建议你启动你的Cygwin 32环境,获取cygwin包版本(我们称之为CYGWIN_PKG_VER),然后在Cygwin 64t环境中,安装最接近%CYGWIN_PKG_VER%的cygwin32版本
更新#0
我在我的测试程序中添加system("echo ${PATH}");
(并且隐式地#include <stdlib.h>
),并且在32 位变体上,系统返回127(就像exe-gcc-032.exe在没有正确路径时的退出代码一样)。我怀疑这 2 不可能不相关,并且在启动32 位应用程序时环境发生了一些事情,并且可能rxvt-native尝试通过system启动bash(或任何其他命令)。
更新#1
因此,可以从Cygwin 64运行32 位应用程序(简单检查,没有透露任何官方消息来源表明它是Unsupported Configuration)。但是在这种特殊情况下,由于应用程序很复杂(它是一个终端,需要运行多个其他应用程序),因此存在问题。可能的方法(一些由其他人建议)走得更远:
- 是时候放手了(可能有一个很好的理由让它没有被移植)。切换到现代替代品 ( Mintty )
- 搜索rxvt的非官方预建64 位版本,或尝试自己构建(还有其他人喜欢它)
- 在您的PC上安装两个环境(Cygwin 32和Cygwin 64 )
- 使用您最喜欢的终端(来自Cygwin 32)。这将是您的“主要”环境
- “远程”
管理Cygwin 64 ,例如通过:
- ssh:我没有检查关于在同一台机器上并行运行的 2 个sshd的限制,但如果没有,您应该将其中一个的侦听端口从默认 ( 22 ) 更改。我建议对前者这样做,以便后者可以使用默认设置从“外部”获得
- 继续研究这个方向,但正如我所见,它开始(如果还没有)成为一个纸牌城堡——这似乎更像是一种解决方法(gainarie)