2

問題のコードは、以前のリリースのWindowsとほぼ同じ構成で機能しましたが、Windows7で実行されたことがまだわかっていません。それが私が今解決する必要があることです。

簡単に言うと、一部のCコードは、Javaプログラムを起動する前に構成とセキュリティのチェックを実行し、Javaでは簡単に実行できないデータを渡します。次に、Javaは適切なタイミングで同じCコードを起動し、それ自体が別のJavaプログラムを起動します。2回目のプログラムの起動は完全に独立している必要があります(nohupと考えてください)。したがって、2回目の起動です。

現在、Cプログラムは通常の方法でJavaプログラムを起動しますが、JavaがCプログラムを起動しようとすると、次のようにエラーが発生します。

/cygdrive/c/opt/ST/v3.3/bin/ST.exe:共有ライブラリのロード中にエラーが発生しました:?:共有オブジェクトファイルを開くことができません:そのようなファイルまたはディレクトリはありません

Windowsは何年にもわたってそのような弱点であったため、CコードはCygwinのposix環境で記述されていますが、実際に行われるのは通常のCタイプのものだけです(Cygwinに固有のものはなく、実際、過去にはMicrosoftの開発ツールを使用して構築されていますが、その環境は現在利用できません)。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=C:/cygwin/bin/bash -c

そして、上記とサポートコードが正常に機能することを確認するためのテストプログラムがあります-それは少しのシェルプログラムを実行し、それが本来あるべきと思ったものを取り戻すことを保証します。それは言う:

シェルを使用してプログラムを実行する機能を確認しています...はい、シェルプログラムは正常に動作します。

cmdの最終的な内容は次のようになります。

cmd.exe / CC:/cygwin/bin/bash -c'/cygdrive/c/opt/ST/v3.3/bin/ST.exe'

私が疑うこと:

Cygwin1.DLLファイルが正しく見つからないことが原因だと思います。C:/cygwin/bin/cygwin1.dllにあります

システムレベルのPATHとCygwinPATHの両方に、cygwin.dllファイルへのパスが含まれていることに注意してください。cygwin1.dllのコピーをターゲット実行可能ファイルが存在するbinディレクトリに移動することも機能しませんでした。

LD_LIBRARY_PATHはここで何か助けになりますか?もしそうなら、それがどのように設定されるかについて何か考えはありますか?

他のアイデア?

ありがとう。

4

2 に答える 2

0
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を使用してプログラムを実行することもできます。

于 2012-04-10T16:52:08.730 に答える
0

いくつかの方法。

cygwin1.dllは、%WINDIR%\system32または同等のものである必要があります。

また

PATH変数を変更して、呼び出し元の環境のcygwin1.dllへのパスを追加します。

また

cygwinビルドexeを呼び出す前に、環境を設定する.batファイルを呼び出します。

また

スタンドアロンバージョンの.exeをビルドします(つまり、cygwin依存関係はありません)。

于 2012-04-10T17:12:43.523 に答える