2012-04-10 33 views
2

有問題的代碼在早期版本的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會在此處提供任何幫助嗎?如果是這樣,任何想法如何設置?

其他想法?

謝謝。

+1

@AlexanderPogrebnyak你是諷刺嗎?同樣的代碼需要「無處不在」 - 而且,除了這個例外 - 還不是Android手機 - 它的確如此。它目前在Solaris,BSD,OSX上,並且它幾乎在任何地方都能正常運行。 – 2012-04-10 16:42:27

+0

對不起,評論已刪除。 – 2012-04-10 18:59:22

回答

0
C:/cygwin/bin/bash -c '/cygdrive/c/opt/ST/v3.3/bin/ST.exe' 

這不起作用,因爲當您執行此命令時,您的工作目錄就是您駐留的地方。您必須將cygwin相關的dll複製到您執行此目錄的目錄中。不管怎樣,你將不得不將cygwin bin目錄放在你的系統PATH變量中,不確定你想這麼做,會導致dll地獄。

另外,如果你在你的個人資料中使用任何東西,你需要添加參數--login來砸:

bash --login -c 

此外,打印最終命令在末端,你產卵過程之前:

printf('%s\n',cmd) 

只是爲了確定它正是你想要的。

如果你不確定被引用的dll,你也可以用strace運行程序。

+0

C:/ cygwin/bin/bash -c'PATH =/bin:$ PATH; /cygdrive/c/opt/ST/v3.3/bin/ST.exe' – Joshua 2012-04-10 16:53:32

+0

Err?這是一個更新的命令嗎?你在這裏問一個問題嗎? – 2012-04-10 16:55:21

+0

@JasonHuntley你的意思是說cygwin1.dll需要與我打電話的圖像存在於同一個目錄中?當然,你不是說_default_working_directory_必須在cygwin1.dll所在的地方設置?! – 2012-04-10 17:14:58

0

幾種方法。

cygwin1.dll需要位於%WINDIR%\ system32或等效文件中。

修改PATH變量添加到調用者的環境cygwin1.dll的路徑。

你打電話給你打電話cygwin的構建EXE之前設置環境.bat文件。

您生成.exe(即不依賴cygwin的)的獨立版本。

+0

是的,我似乎回想起過去這樣的解決方案。不過,我試過......上面的選擇1:沒有工作。在我發佈我的問題之前,選擇2已經實施。選擇3 - 我不是蝙蝠文件的專家,但這實際上是上面發生的事情;你如何「設置環境」的建議是什麼?而你最後一個目前不實際 - 並且想避免它,因爲必須有一個避免這一步驟的解決方案! – 2012-04-10 17:42:34

+0

好吧,但現在我已經嘗試了幾乎所有這些:移動cygwin1.dll不起作用,修改PATH不起作用,調用.bat文件不起作用,而最後一個,我沒有嘗試,因爲它會顯着增加我的負擔......而且,我找到了一個解決方案(將在一分鐘內提供)......但感謝您的想法。 – 2012-04-23 22:59:57

+0

確保你獲得了正確的環境,使用cmd.exe/c \ path \ batchfile.bat – pizza 2012-04-23 23:42:11

相關問題