在Windows 7上从Java启动CYGWIN构build的可执行文件失败,“加载共享库时出错:?:没有这样的文件或目录”

有问题的代码在早期版本的Windows上或多或less具有完全相同的configuration,但是,不知道在Windows 7上运行过吗? 这就是我现在需要解决的问题。

简而言之,一些C代码在启动Java程序之前执行一些configuration和安全检查,并传递一些在Java中很容易做到的数据。 Java又会在适当的时候启动相同的C代码,然后它自己启动一个不同的Java程序。 第二次节目发布需要完全独立,因此第二次发布(想nohup)。

现在发生的事情是C程序以普通的方式启动Java程序,但是当Java尝试启动C程序时,它会出现这样的错误:

/cygdrive/c/opt/ST/v3.3/bin/ST.exe:加载共享库时出错:?:无法打开共享目标文件:没有这样的文件或目录

由于Windows多年来一直如此,C代码是在Cygwin的posix环境下编写的,但实际上所做的只是普通的Ctypes的东西(没有任何关于Cygwin所特有的内容,实际上,在过去它已经用微软的开发工具build立起来了,但目前还没有这个环境)。 Cygwin环境增加了很多其他的好处,比如服务的命令行pipe理(cygrunsrv)和一个完整的类似nix的环境(bash等)。 事实上,由于Windows已经改变了如何多次从Java启动程序,Cygwin有助于标准化Java启动代码。 这是一个摘录:

if (ClientOS.indexOf("Windows") != -1) { if (ClientOS.equals("Windows 95")) { cmd = "command.com /C "; } else if (ClientOS.equals("Windows 98")) { cmd = "command.com /C "; //cmd = "cmd.exe /C "; } else if (ClientOS.equals("Windows NT")) { cmd = "cmd.exe /C "; } else if (ClientOS.equals("Windows 2000")) { cmd = "cmd.exe /C "; } else if (ClientOS.equals("Windows XP")) { cmd = "cmd.exe /C "; } else { cmd = "cmd.exe /C "; } if (cygwin) { cmd += Shell+" '"+Command+"'"; } else { cmd += Command; } } else { cmd = Command; } 

(是的,if结构可以更好地优化。)

在这种情况下,“Shell”等于:

 Shell=C:/cygwin/bin/bash -c 

而且,还有一个testing程序可以确保上述代码和支持代码的正常工作 – 它运行一些shell程序,并确保它恢复了它应该做的事情。 它说:

检查使用shell运行程序的能力…是的,shell程序工作正常。

cmd的最终内容如下所示:

cmd.exe / CC:/ cygwin / bin / bash -c'/cygdrive/c/opt/ST/v3.3/bin/ST.exe'

我怀疑的是:

我怀疑是怎么回事Cygwin1.DLL文件没有find正确的。 它位于C:/cygwin/bin/cygwin1.dll

注意 ,系统级PATH和Cygwin PATH都包含了cygwin .dll文件的path。 将cygwin1.dll的副本移动到目标可执行程序所在的bin目录中也不起作用。

LD_LIBRARY_PATH会在这里提供任何帮助吗? 如果是这样,任何想法如何设置?

其他想法?

谢谢。

Solutions Collecting From Web of "在Windows 7上从Java启动CYGWIN构build的可执行文件失败,“加载共享库时出错:?:没有这样的文件或目录”"

 C:/cygwin/bin/bash -c '/cygdrive/c/opt/ST/v3.3/bin/ST.exe' 

这是行不通的,因为你的工作目录是你执行这个命令时所在的地方。 你将不得不复制cygwin依赖的DLL到你执行这个目录。 另外,你将不得不将cygwin bin目录放在你的系统PATH变量中,不确定你想这样做,会导致dll地狱。

另外,如果您在配置文件中使用了任何内容,则需要将–login参数添加到bash中:

 bash --login -c 

另外,在生成过程之前,最后输出最后的命令:

 printf('%s\n',cmd) 

只要确定它正是你想要的。

你也可以用strace运行程序,如果你不确定被引用的dll。

几种方法。

cygwin1.dll需要在%WINDIR%\ system32或同等。

要么

您修改PATH变量以在调用方环境中添加到cygwin1.dll的路径。

要么

在调用cygwin构建的exe之前,调用一个设置环境的.bat文件。

要么

你建立一个独立版本的.exe(即没有cygwin依赖)。