web-dev-qa-db-ja.com

クリックしても実行可能ファイルが実行されないのはなぜですか?

C++で作成した実行可能ファイルをダブルクリックしても開けないように見えるのはなぜですか。

IDEから実行したファイルがあります。Windowsの.exeファイルと同じように、クリックしたときにターミナルを開くようにそのファイルを設定する方法があるかどうかを知りたいです。行う。

可能性:

  • これを可能にするC++コードをソースコードに追加できます。

  • MyPcを設定して開きます。

私はツールキットをできるだけ避けようとしています。最近、Windowsでアプリケーションをコンパイルしました(いとこのおかげで、彼はWindows付きのPCを持っています)

また、リリースのフォルダーが2つあるので、Linux上のWindowsでも同じことができると便利です。

そして、私はこのシンプルなターミナルベースのアプリが専門家でなくても実行できることを望んでいます。


私はこの行を追加しました:

system( "gnome-terminal");

ターミナルで開きますが、実際のプログラムではなくファイルパスを表示するだけです。

4
Leandro

Linux C++コンパイラによって出力されるファイルに「実行可能」ビットを設定する必要があると思いますが、セキュリティ上の理由から、これはデフォルトでは行われないと思います。

生成された実行可能ファイルが置かれているディレクトリに「cd」するだけです。

chmod +x myexecutable

「myexecutable」をコンパイラ出力の名前に置き換えます。

次に、。/ myexecutableで実行してみます

これにより、コンソールだけでなくマウスクリックを使用してプログラムを「実行可能」にする必要があると思います。

同様に、コマンドの「スクリプト」を実行する必要がある場合は、スクリプトファイルで次のことを試すことができます。これを「myexe.sh」などとして保存します。

#!/bin/sh
command1
command2

その後、再び使用します

chmod +x myexe.sh 

スクリプトをクリックして実行できるようにします。

7
Mokubai

あなたの問題の根本は、ターミナルエミュレータとシェルの違いとLinuxがプロセスを開始する方法をどのように理解しているかを本当に理解していないことだと思います。

まず、「ターミナルエミュレータ」があります。Gnomeベースの環境では、これは通常Gnomeターミナルです。

次に「シェル」があります。Linuxではこれは通常bashですが、他のシェルも可能です。

「シェル」は「ターミナルエミュレータ」内で実行されます。この違いは、物理端末の時代に由来します。物理端末は入力を受け取り、テキストを色で書き込むなどのハードウェアであり、シェルはユーザーコマンドを処理し、指定されたコマンドに基づいて他のプロセスを管理するソフトウェアです。

現在、任意の画像を表示できる汎用画面があるため、物理端末を使用せず、代わりに物理端末のジョブをエミュレートするソフトウェアである「端末エミュレータ」と、現在も使用されているシェルを使用しています。以前と同じole 'シェル(まあ、最近のシェルは、紙の物理的な制限などによって制限されないなど、ソフトウェア端末エミュレーターにあることを利用しますが、分割は残ります)。

「シェル」は、ターミナルエミュレータ内で常に実行されるとは限りません。 Nautilus(ヒント、Nautilusは大きなシェルを持つ海洋生物の名前)やWindows Explorer(Internet Explorerと混同しないでください)などのグラフィカルシェルもあります。

両方のコマンドラインシェルで、たとえばbash、およびグラフィカルシェル(例: Nautilus、実行可能ファイルは、executeビットが設定されていることでマークされます。

コマンドラインシェルでは、ls -lを使用して、ファイルのアクセス許可ビットを表示できます。 rwxrwxrwxは、誰でもプログラムの読み取り/書き込み/実行ができることを意味します。 rwxr-xr--は、所有者が完全な権限を持ち、ファイルのグループ内のユーザーは読み取りと実行はできますが書き込みはできず、他のユーザーはファイルの読み取りのみができることを意味します。 Nautilusでは、ファイルを右クリック> [プロパティ]> [権限]タブを選択できます。 [権限のプロパティ]ページでは、コマンドラインシェルと同様にファイルの権限を設定できます。

実行ビットが設定されているファイルは実行可能ファイルとして扱われ、。/ filename(コマンドラインシェル)を実行するか、ダブルクリック(グラフィカルシェル)することで実行できます。

最後に、シェルがファイルを実行する方法には、他にもいくつかの微妙な点があります。ほとんどのLinuxシェルでは、コンパイルされた実行可能ファイルではないpython/Perl/php/bashで記述されたスクリプトを「実行」できます。これらのファイルはネイティブにコンパイルされた実行可能ファイルではないため、実行するにはインタプリタ(例:pythonインタプリタ))が必要です。ファイルの拡張子を介して呼び出すインタプリタを特定するWindows Shell(Explorer)とは異なります。 ; Linuxシェルは、次のような「ハッシュバン」行を見て、正しいインタープリターを見つけ出します。

#!/usr/bin/python

ファイルの実行ビットが設定されていて、ファイルにこのハッシュバン行がある場合、シェルは現在のファイルを引数としてインタプリタ/ usr/bin/pythonを呼び出します。

Nautilusは、プログラムがコマンドラインアプリケーションであるかどうかも認識でき、ターミナル内でアプリケーションを実行するように提案します。実行可能スクリプトをダブルクリックすると、Nautilusはそれをターミナルで実行するか、ターミナルなしで実行するか、テキストエディタでファイルを編集するかを尋ねます。

4
Lie Ryan

簡単に言えば:

  1. 生成された実行可能バイナリファイルには、executableビットがない可能性があります。 Unixベースのシステムは、セキュリティ上の理由からこの機能を使用します。 chmod +x yourbinaryで設定します。
  2. バイナリは実際に実行される可能性がありますが、Linuxはターミナルエミュレータを実行しないため(これは、ユーザーとstdout)デフォルトで実行するには、何も表示されません。

後者の場合、次のことができます。

  1. 次のように、ターミナルエミュレータを介して実行可能ファイルを実行するスクリプトを作成します。

    exo-open --launch TerminalEmulator -e 'yourbinary'
    

    デフォルトのターミナルで実行するには(exoコマンドがある場合)、または明示的に使用します。

  2. desktop ファイルを作成して実行します。

  3. .execのようなカスタムの特別な拡張子を付け、ファイル拡張子設定(OSがその機能をサポートしている場合)で提案1(または同様のもの)のコマンドを使用して実行するように構成します。

1
arielnmz

xtermなどの中で実行するスクリプトを作成します。終了する前に、プログラムがユーザーと対話することを確認してください。 (xterm内で実行すると機能しますか?通常のbashシェル内で実行すると機能しますか?)

 xterm-eコマンド [args1 args2]
1
bubu

Windowsでコンパイルしていて、それがexeである場合、実行可能ファイルをダブルクリックしたときにWindowsでターミナルが開かない理由はわかりません。コードがシャットダウンしないことを確認しますか(セグメンテーション違反など)?プログラムがクラッシュしないことを確認することをお勧めします。

0
Sriram