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

时间:2013-12-05 06:12:47

标签: java c windows cygwin

我正在尝试诊断(并修复)位于多个组件边界的问题;任何关于如何获得更多信息或彻底解决问题的见解都非常感激。

我有一个应用程序,它作为一个C程序启动,可以启动一个Java程序,然后可以以递归的方式启动相同的C程序。 它一直在Linux和Cygwin上工作。在Java中的程序启动范例中发现了一些错误,它从更简单的运行时策略更新到(1.5中的新增功能)ProcessBuilder策略。出于各种不完整的原因,它会使用-c选项启动bash,然后启动需要调用的。它适用于Linux,但是当移植到Cygwin时,它会失败,如下所述。不幸的是,我不小心删除了正在运行的Cygwin实例,因此我无法轻易辨别出问题是仅仅是配置问题还是更深层次的问题。

为了记录,我认为Cygwin没有任何问题,但我不确定,因为我同时愚蠢地更新了Cygwin。 (我在想什么?!)

当Java尝试启动C程序时出现错误。它总是完全相同的错误:

  加载共享库时出现

错误:?:无法打开共享对象   file:没有这样的文件或目录

在cygwin中对这个错误的研究几乎没有产生任何结果,只有这一点:
http://cygwin.com/ml/cygwin/2012-03/msg00396.html

值得注意的是,运行作为标准Cygwin发行版的一部分的图像的测试运行并且运行正常。相反,程序bs.exe在Cygwin环境中编译和链接。

我正在考虑的一些事情是,如果可能有环境变量我没有包含在环境中,但它应该继承调用者的环境,我没有看到我曾经使用过任何类型的LD_LIBRARY_PATH过去的cygwin环境并未注意到文献中的任何类似参考文献。然后,有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信息如下,剪了一下。更多的要求,因为整个数据集是巨大的,可能无趣。

  

Cygwin配置诊断当前系统时间:2005年12月1日   04:08:40 2013 Windows 7 Professional N Ver 6.1 Build 7600
  在AMD64 Path:W:64下运行:C:\ Program   文件\的Java \ jdk1.7.0 \ BIN           C:\选择\ BIN           C:\ Cygwin的的\ usr \本地\ BIN           C:\ cygwin的\斌           C:\ Program Files(x86)\ Android \ android-sdk \ platform-tools           C:\ Program Files \ PostgreSQL \ 9.3 \ bin           C:\ Program Files \ Java \ jdk1.7.0 \ bin           C:\ Program Files(x87)\ PC连接解决方​​案           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的\斌           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>

0 个答案:

没有答案