簡體   English   中英

在 Windows 7 上從 Java 啟動 CYGWIN 構建的可執行文件失敗,並顯示“加載共享庫時出錯:?:沒有這樣的文件或目錄”

[英]Launching CYGWIN-built executable from Java on Windows 7 fails with "error while loading shared libraries: ?: No such file or directory"

有問題的代碼在 Windows 的早期版本中或多或少地以完全相同的配置工作,但是,不知道它是否在 Windows 7 YET 上運行。 這就是我現在需要解決的。

簡而言之,一些 C 代碼在啟動 java 程序之前執行一些配置和安全檢查,傳遞一些在 Java 中幾乎不可能輕松完成的數據。Java 依次在適當的時間啟動相同的 C 代碼,然后本身會啟動一個不同的 Java 程序。 第二個程序啟動需要完全獨立,(想想 nohup)因此是第二個啟動。

現在發生的事情是 C 程序以普通方式啟動 Java 程序,但是當 Java 嘗試啟動 C 程序時,它會出現如下錯誤:

/cygdrive/c/opt/ST/v3.3/bin/ST.exe:加載共享庫時出錯:?:無法打開共享 object 文件:沒有這樣的文件或目錄

因為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=C:/cygwin/bin/bash -c

並且,有一個測試程序可確保上述代碼和支持代碼正常工作 - 它運行了一些 shell 程序並確保它恢復了它認為應該的狀態。 它說:

檢查使用 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

注意,系統級路徑和 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 目錄放在系統 PATH 變量中,不確定是否要這樣做,可能會導致 dll 地獄。

此外,如果您在個人資料中使用任何內容,則需要將 --login 參數添加到 bash:

bash --login -c

另外,在生成進程之前,在最后打印出最終命令:

printf('%s\n',cmd)

只是為了確保它正是您想要的。

如果您不確定所引用的 dll,您也可以使用 strace 運行該程序。

幾種方式。

cygwin1.dll 需要位於 %WINDIR%\system32 或同等位置。

要么

您修改 PATH 變量以在調用方環境中添加到 cygwin1.dll 的路徑。

要么

在調用 cygwin 構建的 exe 之前,調用設置環境的.bat 文件。

要么

你構建了一個獨立版本的.exe(即沒有cygwin依賴)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM