c语言 - 在 Windows 7 上从 Java 启动 CYGWIN 构建的可执行文件失败,并显示"error while loading shared libraries: ?: No such



有问题的代码在早期版本的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独有的,事实上,过去它是用Microsoft的开发工具构建的,但目前还没有那个环境)。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=C:/cygwin/bin/bash -c

而且,有一个测试程序可以确保上述和支持代码正常工作 - 它运行一些shell程序并确保它得到它认为应该得到的东西。它说:

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

cmd 的最终内容如下所示:

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

我怀疑什么:

我怀疑发生了什么是没有正确找到 Cygwin1.DLL 文件。它位于 C:/cygwin/bin/cygwin1 中.dll

请注意,系统级 PATH 和 Cygwin PATH 都包含 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目录放在系统PATH变量中,不确定是否要这样做,可能会导致dll地狱。

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

bash --login -c

此外,在生成进程之前,在最后打印出最后一个命令:

printf('%sn',cmd)

只是为了确保它正是您想要的。

如果您不确定要引用的 dll,也可以使用 strace 运行该程序。

几种方式。

cygwin1.dll 需要位于 %WINDIR%\system32 或等效版本中。

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

在调用 Cygwin 构建的 EXE 之前,调用设置环境的.bat文件。

您构建了.exe的独立版本(即没有Cygwin依赖项)。

相关内容

最新更新