在Windows 7上从Java启动CYGWIN内置可执行文件失败,出现“0”;加载共享库时出错:?:没有此类文件或目录;
所讨论的代码在早期版本的Windows上或多或少都是在相同的配置下工作的,但是,还不知道它是否在Windows 7上运行过!这就是我现在需要解决的问题 简单地说,一些C代码在启动java程序之前执行一些配置和安全检查,传递一些在java中很难实现的数据。Java在适当的时候依次启动相同的C代码,然后它自己启动一个不同的Java程序。第二次项目启动需要完全独立,(想想nohup),因此第二次启动 现在的情况是,C程序以普通方式启动Java程序,但当Java试图启动C程序时,会出现如下错误: /cygdrive/c/opt/ST/v3.3/bin/ST.exe:加载共享时出错 库:?:无法打开共享对象文件:没有此类文件或 目录 由于Windows多年来一直是一个负担,C代码是在Cygwin的posix环境中编写的,但它真正做的只是普通的C类型的事情(它并不是Cygwin独有的,事实上,在过去它是用微软的开发工具构建的,但该环境目前不可用)。Cygwin环境还增加了许多其他好处,如服务的命令行管理(cygrunsrv)和一个完全开放的类似于nix的环境(bash等)。事实上,由于Windows多次改变了从Java启动程序的方式,Cygwin帮助标准化Java启动代码。这里有一段摘录:在Windows 7上从Java启动CYGWIN内置可执行文件失败,出现“0”;加载共享库时出错:?:没有此类文件或目录;,java,c,windows,cygwin,shared-libraries,Java,C,Windows,Cygwin,Shared Libraries,所讨论的代码在早期版本的Windows上或多或少都是在相同的配置下工作的,但是,还不知道它是否在Windows 7上运行过!这就是我现在需要解决的问题 简单地说,一些C代码在启动java程序之前执行一些配置和安全检查,传递一些在java中很难实现的数据。Java在适当的时候依次启动相同的C代码,然后它自己启动一个不同的Java程序。第二次项目启动需要完全独立,(想想nohup),因此第二次启动 现在的情况是,C程序以普通方式启动Java程序,但当Java试图启动C程序时,会出现如下错误: /cy
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运行程序的能力。。。
是的,shell程序运行良好
cmd的最终内容如下所示:
cmd.exe/C:/cygwin/bin/bash-C'/cygdrive/C/opt/ST/v3.3/bin/ST.exe'
我所怀疑的:
我怀疑发生的事情是没有正确找到Cygwin1.DLL文件。它位于C:/cygwin/bin/cygwin1.dll中
请注意系统级路径和Cygwin路径都包括Cygwin.dll文件的路径。将cygwin1.dll的副本移动到目标可执行文件所在的bin目录也不起作用
LD_LIBRARY_PATH会在这里提供帮助吗?如果是的话,你知道怎么设置吗
其他想法
谢谢
C:/cygwin/bin/bash -c '/cygdrive/c/opt/ST/v3.3/bin/ST.exe'
这将不起作用,因为在执行此命令时,工作目录是您所在的位置。您必须将依赖cygwin的DLL复制到执行此操作的目录中。否则,必须将cygwin bin目录放入系统路径变量中,如果不确定是否要这样做,可能会导致dll地狱
此外,如果您正在使用配置文件中的任何内容,则需要向bash添加--login参数:
bash --login -c
另外,在生成流程之前,在末尾打印出最终命令:
printf('%s\n',cmd)
只是为了确定这正是你想要的
如果您不确定引用的DLL,也可以使用strace运行该程序
这将不起作用,因为在执行此命令时,工作目录是您所在的位置。您必须将依赖cygwin的DLL复制到执行此操作的目录中。否则,必须将cygwin bin目录放入系统路径变量中,如果不确定是否要这样做,可能会导致dll地狱
此外,如果您正在使用配置文件中的任何内容,则需要向bash添加--login参数:
bash --login -c
另外,在生成流程之前,在末尾打印出最终命令:
printf('%s\n',cmd)
只是为了确定这正是你想要的
如果您不确定所引用的DLL,也可以使用strace运行该程序。有几种方法
cygwin1.dll必须位于%WINDIR%\system32或等效文件中
或
修改PATH变量以将路径添加到调用方环境中的cygwin1.dll
或
在调用cygwin内置exe之前,先调用一个设置环境的.bat文件
或
您可以构建.exe的独立版本(即没有cygwin依赖项)。有几种方法
cygwin1.dll必须位于%WINDIR%\system32或等效文件中
或
修改PATH变量以将路径添加到调用方环境中的cygwin1.dll
或
在调用cygwin内置exe之前,先调用一个设置环境的.bat文件
或
您构建了一个独立版本的.exe(即没有cygwin依赖项)。@AlexanderPogrebnyak您是在讽刺吗?同样的一组代码需要“到处运行”——除此之外,Android手机还不需要。它目前在Solaris、BSD、OSX上运行,在任何地方都能正常工作……@AlexanderPogrebnyak你是在讽刺吗?同样的一组代码需要“到处运行”——除此之外,Android手机还不需要。它目前在Solaris、BSD、OSX上运行,几乎在任何地方都可以正常工作……C:/cygwin/bin/bash-C'PATH=/bin:$PATH/cygdrive/c/opt/ST/v3.3/bin/ST.exe'Err?这是更新的命令吗?你在问问题吗?@JasonHuntley你的意思是说cygwin1.dll需要与我调用的映像存在同一个目录中吗?当然你不是说默认的工作目录必须设置在cygwin1.dll所在的位置@约书亚试过了;没用。太糟糕了-这将是一个简单而优雅的解决方案!顺便说一句,我把你的意思理解为,因为/bin是cygwin1.dll的位置,应该可以…@JasonHuntley我试着把cygwin dll放在与我要创建的映像相同的目录中