有问题的代码在早期版本的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会在这里提供任何帮助吗? 如果是这样,任何想法如何设置?
其他想法?
谢谢。
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依赖)。