C ++プログラムを作成し、それをコンパイルしてa.outファイルを作成しました。ただし、実行しようとすると、許可が拒否されます。私はsudoを使用できると読みましたが、うまく動作させることができません。sudo "./a.out"のようなものを使用しますが、それも機能しません。
編集:
「./a.out」を試すと表示されるメッセージを次に示します。
bash: ./a.out: Permission denied
C ++プログラムを作成し、それをコンパイルしてa.outファイルを作成しました。ただし、実行しようとすると、許可が拒否されます。私はsudoを使用できると読みましたが、うまく動作させることができません。sudo "./a.out"のようなものを使用しますが、それも機能しません。
編集:
「./a.out」を試すと表示されるメッセージを次に示します。
bash: ./a.out: Permission denied
回答:
通常、g++
作成されたファイルに実行許可を与えます。-o
オプションを渡さない場合、ファイルの名前はになりますa.out
。
ファイルに実行ビットが設定されていない2つの理由とその解決策:
umaskの値は、それによってセットされてから実行ビットを防止する、0133のような値に設定されています。解決策:許可を明示的に設定します。
chmod 755 a.out
fmask=0022
またはumask=0022
(省略fmask
)でドライブをマウントします。詳細については、マウントのマニュアルページの「脂肪のマウントオプション」セクションを参照してください。実行ビットが設定されていないbashスクリプトの場合、実行できますbash file.sh
。このような機能は、実行可能コンテンツを含むすべてのファイル(コンパイルされたファイルおよびシェバン行#!/path/to/interpreter
セットを持つファイル)に存在します。実行ビットを設定せずにファイルを実行するには、特別なファイル/lib/ld-linux.so.2
(または/lib/ld-linux-x86-64.so.2
64ビットアプリケーション用)を使用してこのようなプログラムを実行します。
/lib/ld-linux-x86-64.so.2 a.out
C:\Ubuntu
作成済み)。Ubuntuインストールではなく「C:」にファイルを配置しない限り、これは問題になりません。Windowsを使用していない場合、または十分なディスク容量がある場合は、専用パーティションにUbuntuをインストールすることをお勧めします。そして再び、NTFS / FAT32は、Linuxのパーミッションをサポートしていないので、あなたが実行することができsudo chown user file
、chmod 755 file
それは動作しません。そのためには、EXTファイルシステムが本当に必要です。
~
を作成~/projects
してそこに入れます。同じことができます。
.outは異常な拡張子です。通常、これは通常「トレース出力」ファイルを意味します。
コンパイルに使用している構文を確認してください
例えば
gcc myfile.c /usr/lib/libsomelibrary.a -o outputfilename
または多分
g++ myfile.cpp -lm -o outputfilename
実行可能ビットがファイルに設定されているかどうかを確認する必要があります
ls -l a.out
または、実行可能ビットを強制することができます
chmod +x a.out
その後、あなたのファイルを実行することができます
./a.out
または単に
a.out
また、おそらく出力ファイルがバイナリとして正しく書き込まれていることを確認する必要があります
すなわち
file a.out
これにより、ファイルの形式(スクリプトまたはバイナリ)が報告されます。
実行可能ファイルを実行できるユーザーを制限していない限り、rootとして実行する必要はほとんどありません。
ルートとしてコンパイルした場合(例:sudo make)、またはルートとして実行可能ファイルをインストールしたMakefileがある場合、ユーザーがログインしたときに権限を取り戻すことをお勧めします
すなわち
sudo chown fred:fred a.out
つまり、「fred」をユーザーIDに置き換えます。
最初の答えのFATファイルシステムの回避策
「これは、FAT32フォーマットのフラッシュドライブにファイルを配置する場合に該当する可能性があります。解決策:(...)ドライブをfmask = 0022またはumask = 0022(fmaskを省略)でマウントします。
通常は機能しません-umaskのデフォルトはほとんど0022であるため、これは何も変更しません。
ただし、特にFATファイルシステムが非rootユーザーとしてマウントされている場合、別のマウントパラメーターのデフォルトは、事実上、バイナリの実行を許可しません。 noexec
そのexec
ため、次のようなオプションでFATフォーマットのドライブをマウントするだけです。
sudo mount -o exec /dev/sd.. /mountpoint
(これは通常、root、つまり「sudo」として実行する必要があります)、そこからバイナリを直接実行できるはずです。
あなたのプログラムが 'main()'関数を持っていないことを望みます。あたかもあなたのコンパイラがa.out実行可能ファイルを作ったかのように。現時点では、コードでいっぱいのオブジェクトファイルにすぎませんが、エントリポイントはありません。main()はCおよびC ++の特別な関数名で、プログラムまたはライブラリにリンクできるオブジェクトファイルだけでなく、プログラムを作成するようコンパイラーに指示します。
GNU GCCのc ++コンパイラであるg ++では、メイン関数のない単純なプログラムを作成できないため、このファイルの作成に使用したコマンドラインを知りたいと思います。
#include <iostream>
using namespace std;
void no_main()
{
cout << "Hello World" << endl;
}
$ g++ hello.cc
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 0 has invalid symbol index 11
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 1 has invalid symbol index 12
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 2 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 3 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 4 has invalid symbol index 11
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 5 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 6 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 7 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 8 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 9 has invalid symbol index 2
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 10 has invalid symbol index 12
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 11 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 12 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 13 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 14 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 15 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 16 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 17 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 18 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 19 has invalid symbol index 13
/usr/bin/ld.bfd.real: /usr/lib/debug/usr/lib/x86_64-linux-gnu/crt1.o(.debug_info): relocation 20 has invalid symbol index 21
/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/../../../crt1.o: In function `_start':
(.text+0x20): undefined reference to `main'
collect2: ld returned 1 exit status
ただし、「void no_main」を「int main」に変更すると機能します:
$ g++ hello.cc
$ ./a.out
Hello World