Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Windows 7上从Java启动CYGWIN内置可执行文件失败,出现“0”;加载共享库时出错:?:没有此类文件或目录;_Java_C_Windows_Cygwin_Shared Libraries - Fatal编程技术网

在Windows 7上从Java启动CYGWIN内置可执行文件失败,出现“0”;加载共享库时出错:?:没有此类文件或目录;

在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

所讨论的代码在早期版本的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启动代码。这里有一段摘录:

  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放在与我要创建的映像相同的目录中