windows 你能在64位安装中运行32位Cygwin应用程序吗?

eanckbw9  于 2023-03-04  发布在  Windows
关注(0)|答案(2)|浏览(456)

是否可以在64位安装中运行32位Cygwin应用程序?
动机:正如Where's the rxvt-native utility gone in cygwin 1.7.26 for 64bit windows?中所讨论的,rxvt-native,我最喜欢的Windows终端模拟器,目前在64 Cygwin中不可用。我希望就像我可以在64位Linux发行版上运行32位Linux应用程序一样,也许我可以在64位Cygwin上运行32位rxvt。
我已尝试将可执行文件从旧PC的C:\cygwin\bin目录复制到新PC的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)

我试过从我的32位系统复制cygwin1.dll文件,但我不知道如何使它只对这个进程可用,而不对其他进程隐藏64位文件。
我的下一个选择是卸载我的64位cygwin,并重新开始与32位变种,但我仍然希望有一种方法...感谢您可以提供的任何帮助。

aoyhnmkz

aoyhnmkz1#

与任何 * 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;
}
    • 输出**:
[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 *。让我们来研究一下这个问题:

[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 * 存在(由上述软件包安装),但无法找到,因为其 * dir * 不在 * PATH * 中(* env**var *-由于其内容长度,无法立即看到)。
请注意,Cygwin * 在此场景中不支持 * LD_LIBRARY_PATH
显而易见的步骤是让系统知道这个 *. dll *,方法是在 * PATH * 中添加它的 * dir *(在开头):

[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 * 对应物,所以目前这是它所能达到的最好效果
  • 运行 . exe * 时可能会遇到一些问题,因为 * cygwin1.dll * 版本之间可能存在差异( rxvt-native. exe * 期望的版本,以及系统上存在的版本)。如果是这样,我建议您启动 * Cygwin32 * 环境,获取 * Cygwin * 软件包版本(我们称之为 * CYGWIN_PKG_VER*),并在 * Cygwin64t * 环境中安装最接近 * %CYGWIN_PKG_VER %* 的 * Cygwin32 * 版本

也可能经历:

更新 *#0 *

我添加了system("echo ${PATH}");(以及隐式#include <stdlib.h>),在 * pc032 * 变量上,* System * 返回***127***(就像 * exe-gcc-032.exe * 在没有正确路径时的退出代码一样)。我怀疑这两个不可能没有关系,环境发生了一些事情,当启动 * pc032 * 应用程序时,并且 * rxvt-native. exe * 可能尝试通过 * 系统 *([Man7]: SYSTEM(3))启动 * Bash *(或任何其他命令)。

更新 *#1 *

因此,可以从 * Cygwin64*运行 * pc032 * 应用程序(简单检查一下,没有发现任何官方来源表明这是一个 * 不支持的配置 *)。但是在这个特殊的例子中,由于应用程序很复杂(它是一个终端,需要运行多个其他应用程序),所以有一个问题。可能的方法(有些是其他人建议的)进一步:

  • 是时候放手了(可能有一个很好的理由为什么它没有被移植)。切换到一个现代的替代品(* Mintty *)
  • 搜索 * RXVT * 的非官方预构建 * pc064 * 版本,或尝试自己构建(还有其他一些人喜欢它)
  • 在您的 * PC * 上安装两个环境(* Cygwin32 * 和 * Cygwin64 *)
  • 使用你最喜欢的终端(来自 * Cygwin32 *)。这将是你的"主"环境
  • "远程"管理 * Cygwin64 *,例如通过:
    SSh:我没有检查关于在同一台机器上并行运行的2 * SShD * 的限制,但是如果没有任何限制,您应该更改其中一个的默认侦听端口( 22 *)。我建议对前者进行更改,以便后者可以使用默认设置从"外部"访问
  • 继续研究这个方向,但在我看来,它开始(如果还没有)成为一个纸牌城堡-这似乎更像是一个(蹩脚的)变通办法(* RO 工作收入 *)
yqkkidmi

yqkkidmi2#

不,你不能。
32位应用程序需要32位cygwin1.dll,而64位cygwin需要64位cygwin1.dll。
rxvtwin32本机被mintty替换,它是缺省的cygwin终端

相关问题