joa*_*nis 4 windows cygwin rxvt 32bit-64bit
是否可以在 64 位安装中运行 32 位 Cygwin 应用程序?
动机:如64 位 Windows 的 cygwin 1.7.26 中的 rxvt-native 实用程序在哪里?, rxvt-native,我最喜欢的 Windows 终端模拟器,目前在 64 位 Cygwin 中不可用。我的希望是,就像我可以在 64 位 Linux 发行版上运行 32 位 Linux 应用程序一样,也许我可以在 64 位 Cygwin 上运行 32 位 rxvt。
我尝试将可执行文件从旧电脑的C:\cygwin\bin目录复制到新电脑的C:\cygwin64\usr\local\bin目录,但无法运行。
当我运行该进程时,它只是默默地什么都不做。
ldd告诉我缺少一些依赖项:
$ ldd /usr/local/bin/rxvt-native.exe
ntdll.dll => /cygdrive/c/Windows/SYSTEM32/ntdll.dll (0x7ffcb79b0000)
??? => ??? (0x77a10000)
wow64.dll => /cygdrive/c/Windows/System32/wow64.dll (0x62c20000)
wow64win.dll => /cygdrive/c/Windows/System32/wow64win.dll (0x62c80000)
Run Code Online (Sandbox Code Playgroud)
我尝试cygwin1.dll从 32 位系统复制该文件,但我不确定如何使其仅可供此进程使用,而不向其他进程隐藏 64 位文件。
我的下一个选择是卸载我的 64 位 cygwin 并重新使用 32 位变体,但我仍然希望有办法...感谢您提供的任何帮助。
与任何Nix发行版一样,Cygwin64模拟器允许运行32 位( pc032 ) 可执行文件(只要它们兼容)。您只需要拥有:
安装了正确的软件包
正确的.dll位于正确的位置(正如您所提到的) - 但手动复制它们(尤其是在系统位置)既不具有可扩展性,也不保证系统之后能够正常工作
首先,您需要(至少)安装Cygwin32软件包:
由于我没有你的pc032可执行文件(我不喜欢搜索下载、解包等...),我创建了一个小示例(要使其运行,你还需要GCC工具链 -我有其他目的,但无论如何这与重现行为的问题无关)。
代码00.c:
#include <stdio.h>
int main()
{
printf("\"void*\" is %d bits long.\n", sizeof(void*) * 8);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
Run Code Online (Sandbox Code Playgroud)[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 code00.c [064bit prompt]> x86_64-pc-cygwin-gcc.exe -o exe-gcc-064.exe code00.c [064bit prompt]> i686-pc-cygwin-gcc.exe -o exe-gcc-032.exe code00.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 142 Jan 16 10:39 code00.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完全相同的问题。这???依赖项是 ( pc032 ) cygwin1.dll。我们来探讨一下问题:
Run Code Online (Sandbox Code Playgroud)[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
因此,pc032 .dll存在(由上述包安装),但无法找到,因为它的目录不在PATH中(env var - 由于其内容长度,这不是立即可见的)。
请注意,在这种情况下, Cygwin不支持LD_LIBRARY_PATH。
显而易见的步骤是通过在PATH中添加它的目录(在开头)来让系统知道这个.dll:
Run Code Online (Sandbox Code Playgroud)[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.
就这样吧。
最后注意事项:
( 64bit ( pc064 )) LDD ( [Cygwin]: ldd ) 是一个.exe(与Nix不同,它是一个脚本),不能很好地处理pc032工件的依赖关系。不幸的是,cygwin32-binutils软件包没有提供不会出现此问题的pc032对应项,因此目前这已经是最好的了
由于cygwin1.dll版本( rxvt-native.exe期望的版本和系统上存在的版本)之间可能存在差异,因此在运行.exe时可能会遇到一些问题。如果是这样,我建议您启动Cygwin32环境,获取Cygwin软件包版本(我们称之为CYGWIN_PKG_VER),然后在Cygwin64t环境上安装最接近%CYGWIN_PKG_VER%的Cygwin32版本
可能还会经历:
我在我的测试程序中添加system("echo ${PATH}");(并且隐式地),并且在pc032变体上,系统返回127(就像没有正确路径时exe-gcc-032.exe的退出代码一样)。我怀疑这两个不可能是无关的,并且在启动pc032应用程序时,环境会发生一些事情,并且可能rxvt-native.exe尝试通过系统启动Bash(或任何其他命令)([Man7]: SYSTEM(3))。#include <stdlib.h>
因此,可以从Cygwin64运行pc032应用程序(简短检查,没有透露任何官方消息来源表明它是不受支持的配置)。但在这种特殊情况下,由于应用程序很复杂(它是一个终端,需要运行多个其他应用程序),因此存在问题。进一步发展的可能方法(其他人建议的一些方法):
是时候放手了(可能有一个很好的理由来解释为什么它没有被移植)。切换到现代替代品 ( MinTTY )
搜索RXVT的非官方预构建pc064版本,或者尝试自己构建它(还有其他一些人喜欢它)
在您的PC上安装两个环境(Cygwin32和Cygwin64)
使用您最喜欢的终端(来自Cygwin32)。这将是您的“主要”环境
“远程”管理Cygwin64,例如通过:
继续研究这个方向,但正如我所见,它开始(如果还没有)成为一个卡片城堡 - 这看起来更像是一个(蹩脚的)解决方法(RO:gainarie)
| 归档时间: |
|
| 查看次数: |
3951 次 |
| 最近记录: |