2017-10-23 3 views
2

シェルありませんWindowsでプログラムがコマンドプロンプト予想通り、私は次のような出力が得られます。プログラムはすぐcygwinの中で、ステータス127で終了し、CMDで動作し、emacsの中には何も出力は私がMinGWのを使用してコンパイルしています次のプログラムを、持っている

C:\p\conscell>conscell.exe 
aoeu 

は、私はCygwinの中でそれを実行したときしかし、私は次の出力を得る(またはその欠如):

$ ./conscell.exe 
$ echo $? 
127 

ご覧のとおり、終了コードは127で、ファイルまたはライブラリの依存関係が見つからないことを示します。さらに、私がM-x shellでプログラムを実行すると、出力はありません(C:/Program Files/Emacs/libexec/emacs/25.3/x86_64-w64-mingw32/cmdproxy.exe)。

私はstring str;行を削除し、これにプログラムを変更する:

#include <iostream> 
#include <string> 
using namespace std; 

int main() { 
    cout << "aoeu" << endl; 
    return 0; 
} 

Cygwinの出力によって目撃として次にCygwinとEmacsは、ファイルを見つけることができます:

$ ./conscell.exe 
aoeu 

これが表示されますプログラム内でstd::stringを使用すると、cmdが検出できるいくつかのファイルに依存するが、Cygwinおよびcmdproxy.exeはそれに依存しないことを示すために使用します。それらがどのファイルであるかを理解する上での助けとなります。

答えて

3

実行可能ファイルを依存関係ウォーカーまたは同様のユーティリティでチェックして、依存するライブラリを把握する必要があります。実行可能ファイルと同じフォルダに入れて、現在の環境に関係なく見つけられるようにします。 Dynamic-Link Library Search Orderを参照してください。あるいは、それらを静的にリンクすることもできます。

+0

これが答えであることを確かめてください(他の回答のコメントを参照)。私は明日すべてをテストし終えるでしょう。 – jcarpenter2

+0

ええ、そうだった。正確には、[このコード](http://forum.cheatengine.org/viewtopic.php?t=563414)を変更して読み込まれたすべてのDLLの名前を取得し、[チートエンジン]を使用してexeを一時停止するhttp://www.cheatengine.org/)。デバッガは動作するはずです。次に、ロードされたDLLごとに、どこから来たのかを知るために端末で '[dll]'を実行しました。彼らはすべてmingwから来た 'libstdC++ - 6.dll'とPATHのmingwの前に出てきたgtksharpを除いてsystem32からのものでした。私の場合、gtksharpは必要ありませんでしたので、私はそれをアンインストールしました。 – jcarpenter2

+0

もちろん、これらのプログラムを人に与えるつもりなら、 '-static-libC++'でコンパイルするか、あるいは、いずれにしてもDLLをパッケージ化する必要があります。 – jcarpenter2

1

MinGWはGCCでコンパイルしますが、Windows環境ではコンパイル時にWindowsのlibsとコンパイルを使用することがあります。 Cygwinは軽量のUnix環境です。

私が間違っていない場合、cygwinにはMinGWまたはGCCが含まれています。 Windowsでプログラムを実行したい場合は、Unix OS上でUnixの作業を実行する場合は、スタンドアロンのminGW でコンパイルしてください。 両方を使いたい場合は、2回コンパイルする必要があります。両方のコンパイラでコンパイルされたmakefileを使用してください。

+0

私はCygwinを使って他の多くのEXEを実行できます。私のワークフローには、emacsシェル内でのアプリケーションのテストが含まれているので、そこでコンパイルして実行したいと考えています。 – jcarpenter2

+0

あなたが編集した他のプログラムは、CMDとcygwinとemacsで動作しますが、これは特にありませんか? – HangrY

+0

ええ、かなり。私はこれを言うべきかどうかは分かりませんが、ウィンドウを再インストールする前に、emacsシェル内で 'std :: string'を使ってプログラムをコンパイルして実行できるようになりましたが、今はできません。私は違いが何であるか分からない。 – jcarpenter2

関連する問題