像任何
LNX
分配,即
CygWin 64
Emulator允许运行
32位
可执行文件(只要它们兼容)。您只需要:
-
安装了正确的软件包
-
右边
动态链接库
S在正确的位置(如您所提到的)-但是手动复制它们(尤其是在系统位置)既不可扩展,也不能保证系统在之后能够正常工作
首先,你需要
CygWi32
安装的程序包(至少):
因为我没有你的
32位
可执行文件(我不像搜索、下载、解包等…)我创建了一个小示例(要使其运行,您需要
海湾合作委员会
工具链——我有其他用途,但无论如何,这与问题无关),它复制了行为。
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
正如你所看到的,我也遇到了同样的问题
EXC-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位
动态链接库
存在(由上述包安装),但找不到,因为其目录不在
${PAT}
(由于内容长度的原因,这不会立即可见)。注意
赛文
不荣誉
$ld_library_path_
在这种情况下。
最明显的步骤是让系统知道这一点
动态链接库
,通过将其dir添加到
${PAT}
(
开始的时候
):
[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位
)
低密度脂蛋白
这是一个
exe
(不像)
尼克斯
如果它是脚本),则无法优雅地处理
32位
人工制品。不幸的是,
Cygwin32-Binutils
程序包不提供
32位
不会有这个问题的对应物,所以目前这是最好的。
-
在运行您的
exe
,因为
CygWiN1.DLL
版本(即
RXVT-NATEVE.EXE
期望值,以及系统上存在的值)。如果是这样,我建议你开始
CygWin 32
环境,获取
赛文
程序包版本(
让我们称之为
$cygwin_pkg_ver_
)
CygWin 64 T
环境,安装
CygWi32
最接近的版本
$cygwin_pkg_ver_
@编辑0
:
我补充说
system("echo ${PATH}");
(隐含地)
#include <stdlib.h>
)在我的测试程序中,
32位
变体,
系统
返回
一百二十七
(就像
EXC-GCC-032.EXE
没有正确路径时的退出代码)。我怀疑2号不能是无关的,当发射时,环境发生了变化。
32位
应用程序,可能
RXVT本机
尝试发射
猛击
(或任何其他命令)通过
系统
.
@ Eddi1
:
所以,
可以运行
32位
应用程序来自
CygWin 64
(一个简短的检查,没有透露任何官方消息说这是一个
不支持的配置
)。但在这个特定的例子中,由于应用程序很复杂(它是一个终端,需要运行多个其他应用程序),所以存在一个问题。进一步发展的可能方法(有些人建议):
-
是时候放手了(可能有一个很好的理由没有预告)。换成现代的(
薄荷
)
-
搜索非官方预制构件
64位
版本
终端窗口
或者试着自己做(有些人喜欢)
-
有两种环境(
CygWin 32
和
CygWin 64
)安装在您的
个人计算机
-
使用您最喜欢的终端(从
CygWin 32
)这将是你的“主要”环境
-
管理
CygWin 64
“远程”,例如通过:
-
嘘
:我没有检查关于2的限制
SSHD
在同一台计算机上并行运行,但如果没有,则应将侦听端口从默认值更改为(
二十二
)其中一个。我建议为前者这样做,以便后者可以从“外部”使用默认设置
-
继续研究这个方向,但正如我看到的,它开始(如果还没有)成为一张城堡卡-这看起来更像是一个解决方法(
盖纳里
)