有問題的代碼在早期版本的Windows上或多或少具有完全相同的配置,但是,它不知道在Windows 7上運行!這就是我現在需要解決的問題。在Windows 7上從Java啓動CYGWIN構建的可執行文件失敗,並顯示「加載共享庫時出錯:?:沒有這樣的文件或目錄」
簡而言之,一些C代碼在啓動java程序之前執行一些配置和安全檢查,並傳遞一些在Java中很容易做到的不可能的數據。反過來,Java在適當的時候啓動相同的C代碼,然後它自己啓動一個不同的Java程序。第二次節目發佈需要完全獨立,因此第二次發佈(想想nohup)。
現在所發生的是,C程序在普通方式啓動Java程序,但是當Java嘗試啓動C程序,就出現了錯誤是這樣的:
/cygdrive/C /選擇/ST/v3.3/bin/ST.exe:錯誤而載入共享 庫:?:無法打開共享對象文件:沒有這樣的文件或目錄
因爲Windows已經如此不堪多年來,C代碼是在Cygwin的posix環境中編寫的,但它的確是普通的C類型(沒有任何關於它是Cygwin獨有的,實際上,過去它已經用微軟的開發工具構建,但目前還沒有這種環境)。 Cygwin environ增加了很多其他的好處,例如服務的命令行管理(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;
}
(是的,如果結構可以更好地優化)
在這種情況下,「殼牌」等於:
Shell=C:/cygwin/bin/bash -c
而且,有一個測試程序確保上述代碼和支持代碼正常工作 - 它運行一些shell程序並確保它恢復了它應該做的事情。它說:
檢查使用shell運行程序的能力... 是的,shell程序工作正常。
CMD的最後一個內容是這個樣子:
的cmd.exe/CC:/ Cygwin的/斌/慶典-c「/cygdrive/c/opt/ST/v3.3/斌/ ST.exe」
什麼我懷疑:
我懷疑這是怎麼回事的是,Cygwin1.DLL文件沒有被正確發現。它生活在C:/cygwin/bin/cygwin1.dll
注意系統級PATH和Cygwin PATH包含路徑到cygwin .dll文件。將cygwin1.dll的副本移到目標可執行程序所在的bin目錄中也不起作用。
LD_LIBRARY_PATH會在此處提供任何幫助嗎?如果是這樣,任何想法如何設置?
其他想法?
謝謝。
@AlexanderPogrebnyak你是諷刺嗎?同樣的代碼需要「無處不在」 - 而且,除了這個例外 - 還不是Android手機 - 它的確如此。它目前在Solaris,BSD,OSX上,並且它幾乎在任何地方都能正常運行。 – 2012-04-10 16:42:27
對不起,評論已刪除。 – 2012-04-10 18:59:22