はじめに
僕のPCではデュアルブートしていて、両OSでデータが共有できるように共有パーティションを作ってあります。
この共有パーティションはfat32というファイルシステムですが、このファイルシステム上では権限関連の概念がないらしいです。
したがって、C/C++の環境構築をした際にエラーが起こりました。
(この記事内でも言及しました。)
本記事では、このエラーの解決方法を説明していきます。
前提環境
- Ubuntu 18.04.2 LTS
- コンパイルした後のファイルを実行できる環境(この記事内参照)
具体的なエラー内容
この記事内で、コンパイルした後のファイルの実行ができませんでした。
$ gcc -o hello hello.c && ./hello
bash: ./hello: 許可がありません
$ g++ -o hello hello.cpp && ./hello
bash: ./hello: 許可がありません
エラー原因
そもそも、fat32では実行権限が付与できないらしいことがわかりました。(参考サイト)
実際にファイルの実行権限をGUIで確認してみると、以下のように付与してもリセットされてしまいました。
解決方法
今回は、fat32じゃないシステム上に実行ファイルを作成し、それを実行するようにします。
以下のコマンドで、ubuntuのシステムに実行ファイルだけ保存し、それを実行するようにしています。
$ gcc -o /home/nsd/ドキュメント/hello hello.c && /home/nsd/ドキュメント/hello
$ g++ -o /home/nsd/ドキュメント/hello hello.cpp && /home/nsd/ドキュメント/hello
しかし、毎回これをやるのは非常にめんどくさいので、シェルスクリプトを書いて任意のコマンドを実行すると一気にコンパイルから実行までしてくれるようにやってみます。
#!/bin/bash
gcc -o /home/nsd/ドキュメント/c-file $1 && /home/nsd/ドキュメント/c-file
#!/bin/bash
g++ -o /home/nsd/ドキュメント/c++-file $1 && /home/nsd/ドキュメント/c++-file
パスは、fat32じゃないとこならどこでもいいです。
そして、コマンドとして実行できるようにします。
僕はC.shとC++.shを/home/nsd/ドキュメントの直下に置きました。
そして、このファイルをおいた場所でターミナルを開き、以下のコマンドを実行します。
$ sudo cp C.sh /bin/C-command
$ sudo cp C++.sh /bin/C++-command
このコマンドで、C-command ファイル名, C++-command ファイル名と打つことでどこからでもC/C++のファイルがコンパイルし実行できるようになりました!(コマンド名は何でもいいので好きにつけてもらってOKです。)
実際に以前書いた記事でのHelloWorldのプログラムを実行してみます。
$ C-command hello.c
$ C++-command hello.cpp
これで無事、fat32上にあるC/C++プログラムのコンパイル・実行が手軽にできるようになったと思います!
※もしこれで許可がないって出たら、/binに飛んで
$ sudo chmod +x C-command
$ sudo chmod +x C++-command
で実行権限付与してからもっかいやってみてください。
まとめ
この記事では、fat32上にあるC/C++プログラムを、シェルスクリプトを使って簡単にコンパイル・実行できるようにしました。
他のコンパイラ言語でも同様のことが起きると思うので、他の言語でもまた書いていこうと思います!
環境構築の方法自体はこの記事で書いたので、そちらの方をチェックお願いします!