草庐IT

windows - 您可以在64位安装中运行32位Cygwin应用程序吗?

coder 2024-06-20 原文

是否可以在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位变体重新开始,但是我仍然希望有办法...感谢您提供的任何帮助。

最佳答案

像任何Lnx发行版一样,Cygwin 64仿真器允许运行32位可执行文件(只要它们兼容)。您只需要拥有:

  • 正确安装的软件包
  • 正确的.dll在正确的位置(如您所述)-但是手动复制它们(尤其是在系统位置)既不可扩展,也不保证
  • 之后系统将正常运行

    首先,您需要安装 cygwin32 软件包(至少):



    由于我没有您的32位可执行文件(我不喜欢搜索下载,解压缩等),因此我创建了一个小示例(要使其运行,您还需要gcc工具链-我出于其他目的而拥有,但无论如何,这都与再现行为的问题无关。

    code.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]> uname -a
    CYGWIN_NT-10.0 cfati-5510-0 2.11.2(0.329/5/3) 2018-11-08 14:34 x86_64 Cygwin
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> ls
    code.c
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> x86_64-pc-cygwin-gcc.exe -o exe-gcc-064.exe code.c
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> i686-pc-cygwin-gcc.exe -o exe-gcc-032.exe code.c -m32
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> 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
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]>
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> file exe-gcc-064.exe
    exe-gcc-064.exe: PE32+ executable (console) x86-64, for MS Windows
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> 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)
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> ./exe-gcc-064.exe
    "void*" is 64 bits long.
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]>
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> file exe-gcc-032.exe
    exe-gcc-032.exe: PE32 executable (console) Intel 80386, for MS Windows
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> 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)
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> ./exe-gcc-032.exe
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]>
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> echo $?
    127
    


    如您所见,我遇到了与exe-gcc-032.exe完全相同的问题。这 ???依赖项是32位cygwin1.dll。让我们探讨一下这个问题:

    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> find /usr -name cygwin1.dll
    /usr/i686-pc-cygwin/sys-root/usr/bin/cygwin1.dll
    /usr/bin/cygwin1.dll
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> cygcheck -f /usr/bin/cygwin1.dll
    cygwin-2.11.2-1
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> file /usr/bin/cygwin1.dll
    /usr/bin/cygwin1.dll: PE32+ executable (DLL) (console) x86-64, for MS Windows
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]>
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> cygcheck -f /usr/i686-pc-cygwin/sys-root/usr/bin/cygwin1.dll
    cygwin32-2.10.0-1
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> 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
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]>
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> 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/Delphi/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:/cygdrive/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 Engine 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/Install/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}

    显而易见的步骤是通过在$ {PATH}(在开头的)中添加其.dir来使系统知道此.dll:

    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> export PATH=/usr/i686-pc-cygwin/sys-root/usr/bin:${PATH}
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> ./exe-gcc-032.exe
    "void*" is 32 bits long.
    [cfati@cfati-5510-0:/cygdrive/e/Work/Dev/StackOverflow/q054206577]> ./exe-gcc-064.exe
    "void*" is 64 bits long.
    


    妳去

    最后的注释:
  • (64位)ldd是一个.exe文件(不同于在Nix上是脚本),它不能正常处理32位人工制品的依赖项。不幸的是,cygwin32-binutils软件包没有提供不会出现此问题的32位副本,因此目前,这和
  • 一样好。
  • 由于cygwin1.dll版本(rxvt-native.exe期望的版本与系统上存在的版本)之间可能存在差异,因此在运行.exe时可能会遇到一些问题。如果是这样,建议您启动Cygwin 32环境,获取cygwin软件包版本(,我们将其称为$ {CYGWIN_PKG_VER} ),然后在Cygwin 64t环境中,安装最接近$ {CYGWIN_PKG_VER的cygwin32版本

  • @ EDIT0 :

    我在测试程序中添加了system("echo ${PATH}");(和隐式的#include <stdlib.h>),在32位变体上,系统返回 127 (就像exe-gcc-032.exe的退出代码一样,如果没有正确的路径)。我怀疑2可能是无关的,启动32位应用程序时环境可能会发生一些变化,并且rxvt-native可能尝试通过系统启动bash(或任何其他命令)。

    @ EDIT1 :

    因此,可以从Cygwin 64 运行32位应用程序(简短的检查,没有显示任何官方消息表明它是不受支持的配置)。但是在这种特殊情况下,由于该应用程序很复杂(它是一个终端,需要运行多个其他应用程序),因此会出现问题。进一步的可能方法(有人建议的方法):
  • 时间放手了(可能有一个很好的理由,原因是它没有被移植)。切换到现代替代品(Mintty)
  • 搜索非官方的预构建的64位版本的rxvt,或尝试自己构建它(有些人喜欢它)
  • 在PC上同时安装了两种环境(Cygwin 32和Cygwin 64)
  • 使用您最喜欢的终端(来自Cygwin 32)。这将是您的“主要”环境
  • “远程”管理Cygwin 64,例如通过:
  • ssh :我没有检查关于在同一台机器上并行运行的2个sshds的限制,但是如果没有限制,则应将其中之一的监听端口更改为默认值(22)。我建议对前者执行此操作,以便可以使用默认设置
  • 从“外部”使用后者
  • 继续朝这个方向进行研究,但据我所知,它开始成为城堡卡了(如果还没有的话)-这似乎更像是一种变通方法(gainarie)
  • 关于windows - 您可以在64位安装中运行32位Cygwin应用程序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54206577/

    有关windows - 您可以在64位安装中运行32位Cygwin应用程序吗?的更多相关文章

    1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

      类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

    2. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

      我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

    3. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

      我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

    4. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

      我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

    5. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

      使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

    6. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

      查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

    7. ruby - 完全离线安装RVM - 2

      我打算为ruby​​脚本创建一个安装程序,但我希望能够确保机器安装了RVM。有没有一种方法可以完全离线安装RVM并且不引人注目(通过不引人注目,就像创建一个可以做所有事情的脚本而不是要求用户向他们的bash_profile或bashrc添加一些东西)我不是要脚本本身,只是一个关于如何走这条路的快速指针(如果可能的话)。我们还研究了这个很有帮助的问题:RVM-isthereawayforsimpleofflineinstall?但有点误导,因为答案只向我们展示了如何离线在RVM中安装ruby。我们需要能够离线安装RVM本身,并查看脚本https://raw.github.com/wayn

    8. ruby-on-rails - Rails 应用程序之间的通信 - 2

      我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

    9. ruby - 无法运行 Rails 2.x 应用程序 - 2

      我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

    10. ruby-on-rails - rails 目前在重启后没有安装 - 2

      我有一个奇怪的问题:我在rvm上安装了ruby​​onrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(

    随机推荐