web-dev-qa-db-ja.com

cで作成されたプログラムは、Windowsではダブルクリックで実行されますがLinuxでは実行されません

OS、Linux(UbuntuとCentOS)、Windows 7の両方で、同じソースコードを使用して、次のような簡単な追加プログラムをCで作成しました。

#include <stdio.h>
int main(){
int a,s,d;

printf("type the values u want to add and give tab between them\n");

scanf("%d %d",&a,&s);

d=a+s;

printf("addition is %d",d);

return 0;

system("read -p 'Press Enter to EXIT...' var");
}

Windowsではaddition.exeをダブルクリックすると実行されますが、Ubuntuでは(CentOSでも)実行可能ファイルadditionをクリックしても何も起こりません。端末を実行したり開いたりすることはありません。ただし、ターミナルで./additionと入力すると実行されます。

しかし、私はそれをダブルクリックして実行したいと思います。私は何をすべきか?

そのファイルのプロパティはこの画像にあります:

Properties of the "addition" executable file

また、プロパティのopen withセクションに「open in terminal」のようなオプションはありません。

次のような.desktopファイルも作成してみました。

[Desktop Entry]
Name=addition
Type=Application
Exec=/media/smit/D/smits programs of c/projects by code blocks/02U/addition/bin/Debug/addition
Terminal=true

addition.desktopをクリックすると、アプリケーションの起動中にエラーが発生したと表示されます。

また、このデスクトップファイルを/usr/share/applicationsにコピーして開こうとしました。

4
voldimot

問題の核心は、コンソールアプリケーションであるプログラムを実行しようとしているが、端末が接続されていないことです。ターミナルでは、プログラム名を呼び出すだけでプログラムを実行できますが、GUIでは、コンソールアプリを実行するためにターミナルウィンドウを表示する必要があることを明示的に指定する必要があります(これは、UbuntuのUnityなどのGNOMEベースのデスクトップに特に当てはまります) 。

実行する必要があるのは、4つのフィールドを持つプログラム用の_.desktop_ファイルも作成する必要があるということです。次に例を示します。

_[Desktop Entry]
Name=MyProg
Type=Application
Exec=/home/xieerqi/example_directory/hello_world_prog
Terminal=true
_

CentOSについてはわかりませんが、Ubuntuに関する限り、_.desktop_アプリケーションも実行可能にする必要がありますユーザーのホームディレクトリの下の任意のディレクトリにある場合。 _.desktop_などの他のディレクトリにある_/usr/share/applications_ファイルはそれを必要としません。

したがって、_.desktop_ファイルを配置して実行可能にすると、プログラムを実行できるようになります。重要なビットは_Terminal=true_行です。これが、GUIに端末を起動し、そこでプログラムを実行するように指示するものです。 [〜#〜]注[〜#〜]:プログラムが何かを実行してすぐに終了する場合、何らかの遅延またはgetchar();プログラムを終了するとターミナルウィンドウが終了するため、ウィンドウを開いたままにするだけです。そのため、多くのユーザーが「プログラムが実行されないのはなぜですか」と混乱することがあります。実行されますが、実際には、終了が速すぎます。


追加メモ

  • system("read -p 'Press Enter to EXIT...' var");を取り除きます。 read呼び出しは組み込みシェルであり、スタンドアロンプ​​ログラムではありません。これは、 bashなどのシェル。 Cを使用している場合は、scanf()またはgetchar()を使用して適切に実行し、プログラムに遅延を追加します。 _return 0;_行の後に存在します。これは、system()行に到達しないことを意味します(プログラムはreturnステートメントで終了します)。したがって、プログラムの一時停止の配置も無効です。
  • 公式ドキュメント へのリンクを含む適切な_.desktop_ファイルの例については、AskUbuntuで この投稿 を読んでください。
  • 怠惰で、実行可能ファイルごとに_.desktop_ファイルを作成したくない場合は、解決策がたくさんあります here 。そこにもスクリプトを投稿しました。
10