gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:49:36 26 4
gpt4 key购买 nike

有问题的代码在早期版本的 Windows 上或多或少地以完全相同的配置工作,但是,还不知道它是否可以在 Windows 7 上运行!这就是我现在需要解决的问题。

简而言之,一些 C 代码在启动 Java 程序之前执行一些配置和安全检查,传递一些在 Java 中几乎不可能轻松完成的数据。反过来,Java 在适当的时间启动相同的 C 代码,然后它自己启动一个不同的 Java 程序。第二个程序启动需要完全独立,(想想 nohup)因此是第二个启动。

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

/cygdrive/c/opt/ST/v3.3/bin/ST.exe: error while loading shared libraries: ?: cannot open shared object file: No such file or directory

因为这些年Windows这么熊,C代码是在Cygwin的posix环境下写的,但它真正做的只是普通的C类型的东西(没有什么是Cygwin独有的,事实上,在以前都是用微软的开发工具搭建的,但是那个environ目前没有)。 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=C:/cygwin/bin/bash -c

并且,有一个测试程序可确保上述代码和支持代码正常工作 - 它运行一些 shell 程序并确保它返回它认为应该返回的内容。它说:

Checking the ability to run a program using a shell... Yes, shell programs work fine.

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 hell。

此外,如果您在个人资料中使用任何内容,则需要将 --login 参数添加到 bash:

bash --login -c

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

printf('%s\n',cmd)

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

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

关于java - 在 Windows 7 上从 Java 启动 CYGWIN 构建的可执行文件失败并显示 "error while loading shared libraries: ?: No such file or directory",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10092730/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com