加载共享库时出错:?:无法打开共享对象文件:没有这样的文件或目录

我试图诊断(并解决)一个位于几个组件边界上的问题; 任何有关如何获得更多信息或直接解决问题的见解,都非常感激。

我有一个应用程序开始作为一个C程序,可能会启动一个Java程序,然后可能以recursion方式启动相同的C程序。 它一直在Linux和Cygwin上工作。 在Java中的程序启动模式中发现了一些错误,并且从较简单的运行时策略更新为(新的1.5)ProcessBuilder策略。 出于各种不明原因, 它会启动带有-c选项的bash,然后是任何需要调用的选项。 它在Linux上工作,但是当移植到Cygwin时,它将失败,如下所述。 不幸的是,我不小心删除了正在运行的Cygwin实例,所以我不能轻易发现问题是否仅仅是configuration问题或更深层次的问题。

为了logging,我不认为Cygwin有什么问题,但是我不确定,因为我同时愚蠢地更新了Cygwin。 (我想什么?!)

Java尝试启动C程序时出错。 这总是一样的错误:

加载共享库时出错:?:无法打开共享对象文件:没有这样的文件或目录

cygwin中这个错误的研究几乎没有产生,只有这个:
http://cygwin.com/ml/cygwin/2012-03/msg00396.html

值得注意的是,testing运行的图像,是标准的Cygwin分布运行的一部分,工作正常。 相反,程序bs.exe在Cygwin环境下编译和链接。

我正在考虑的一些事情是,如果可能有环境variables,我没有包括在环境中,但它应该inheritance调用者的环境,我没有看到我曾经在cygwin环境中使用任何types的LD_LIBRARY_PATH过去并没有在文献中注意到任何类似的参考文献。 然后,有一些Java策略,但是之前没有任何改变,当我将cygwin添加到文件中时,没有任何帮助。

…我已经用完了想法…有人吗?

更新:这是Java中的ProcessBuilder代码的代码片段:

public results ExecuteProgram(String program, String log) { results r = new results(); boolean returnString = false; if (Empty(log)) { log = getTempFile(); } File lf = null; ProcessBuilder pb; r.OK = true; r.err = "Unable to Run program: "; int status = 0; //Note that 0 = success! // Before we get here, we know the first space delimited substring // of the program string already has the full path to the program. The // rest (if any) are arguments. try { // Shell contains something like /bin/bash, depending on the system // pb = new ProcessBuilder(Shell, "-c", program); // Map<String, String> env = pb.environment(); // env.remove("PATH"); // env.put("PATH", Path); // env.remove("CLASSPATH"); // env.put("CLASSPATH", CLASSPATH); // env.remove("LD_LIBRARY_PATH"); // env.put("LD_LIBRARY_PATH", LD_LIBRARY_PATH); // ALSO DO: // LD_LIBRARY_PATH pb.directory(new File(wd)); pb.redirectErrorStream(true); lf = new File(log); pb.redirectOutput(Redirect.appendTo(lf)); Process p = pb.start(); assert p.getInputStream().read() == -1; if (!returnString) { assert pb.redirectInput() == Redirect.PIPE; assert pb.redirectOutput().file() == lf; } r.err = "OS Process started."; r.OK = true; try { r.Status = p.exitValue(); r.err = "OS Process completed."; } catch (IllegalThreadStateException e) { } } catch (IOException e) { r.err += "\nIOException while accessing IO stream: "+ e.toString(); r.OK = false; } if ((r.Status == 0) && (r.OK)) { r.err = "Success"; } else { if (r.Status != 0) { r.err += "Process exit status: "+r.Status; } System.out.print(r.err); } return r; } 

哦,是的,按照惯例,cygcheck -s信息如下,缩小一点。 由于整个数据集非常庞大而且可能没有趣味,所以请求更多。

Cygwinconfiguration诊断当前系统时间:星期四十二月04:08:40 Windows 7 Professional N版本6.1 Build 7600
运行在AMD64上的WOW64下:C:\ Program Files \ Java \ jdk1.7.0 \ bin C:\ opt \ bin C:\ cygwin \ usr \ local \ bin C:\ cygwin \ bin C:\ Program Files(x86) \ Program Files \ PostgreSQL \ 9.3 \ bin C:\ Program Files \ Java \ jdk1.7.0 \ bin C:\ Program Files(x87)\ PC Connectivity Solution C:\ windows \ \ system32 C:\ windows C:\ windows \ System32 \ Wbem C:\ windows \ System32 \ WindowsPowerShell \ v1.0 C:\ Program Files(x86)\ Microsoft SQL Server \ 90 \ Tools \ binn C:\ Program Files x86 \ Toshiba \ Bluetooth Toshiba Stack \ sys C:\ Program Files(x86)\ Toshiba \ Bluetooth Toshiba Stack \ sys \ x64 C:\ Program Files \ Intel \ WiFi \ bin C:\ Program Files \ Common Files \ Intel \ WirelessCommon C:\ cygwin \ bin C:\ Program Files \ PostgreSQL \ 9.3 \ bin C:\ cygwin \ lib \ lapack

 Cygwin DLL version info: DLL version: 1.8.4 DLL epoch: 19 DLL old termios: 5 DLL malloc env: 28 Cygwin conv: 181 API major: 0 API minor: 262 Shared data: 5 DLL identifier: cygwin1 Mount registry: 3 Cygwin registry name: Cygwin Program options name: Program Options Installations name: Installations Cygdrive default prefix: Build date: Shared id: cygwin1S5 <snip>