Contents
はじめに
c++ プログラムをコンパイルして実行しようとしたら想定外のエラーが出て困惑している人向けの記事です.
次のようなエラーメッセージが出力されていて途方にくれていませんか?
$ ./hello
zsh: permission denied: ./hello
$ ./hello
zsh: exec format error: ./hello
その原因,もしかしたら depot_tools
にパスが通っていることが原因かもしれません.
本記事では,このような問題に対する解決方法を提示します.
お困りの方,発狂せずにこの記事を読んでください.
さぁ,深呼吸,深呼吸.
エラーメッセージは permission denied もしくは exec format error ですか
たぶん,いつものように何気なく g++
コマンド叩いて c++ プログラムをコンパイルしましたよね?
$ g++ -g -o hello -c hello.cc
コンパイルしたから実行しよー,と思って実行可能ファイルを実行したら,
まさかの permission denied
ってエラーメッセージ出てびっくりしましたよね?
$ ./hello
zsh: permission denied: ./hello
権限ないから権限与えるかー,と思って $ chmod 755 hello
で実行権限与えた後に実行したら,
まさかの exec format error
ってなってびっくりしましたよね?
$ chmod 755 hello
$ ./hello
zsh: exec format error: ./hello
exec format error
の原因ですが,もしかしたら depot_tools
が悪さをしてるかもしれません.
depot_tools へのパスを削除すると期待動作するかも
筆者の場合ですが,$PATH
環境変数に含まれている
/path/to/depot_tools
を削除すると期待動作しました.
depot_tools
のどこがどういう風に想定外の悪さをしていたのか,そこまでは調べていません.
筆者の MacMini と Macbook Air のどちらも depot_tools
へのパスを削除したら,
期待動作したので depot_tools
が悪さをしていたのは確実なのですが.
まぁ,原因の本当の理由が分からなくても depot_tools
が悪さをしていることは確実なので,
vscode とか vi で $HOME/.zshrc
を編集して depot_tools
へのパスを削除して,
source
コマンド実行すれば ok です.
depot_tools
へのパスの有効化は direnv
などを使って,
使うときだけ有効にした方が今回のような想定外の問題に直面しなくなって良いと思います.
$ code $HOME/.zshrc
$ source $HOME/.zshrc
その後に,g++
でコンパイルしてあげれば,普段通り実行できるようになりますよ!
$ g++ -g -o hello -c hello.cc
$ ./hello
Hello, world
おわりに
MacOS で c++ プログラムを実行しようとしたら想定外のエラーが出て途方にくれたが,
depot_tools
へのパスを削除したら期待動作するようになったお話でした.
参考になった,面白かった,など思っていただけたら嬉しいです.
最後までお読みいただきありがとうございました.
愛用品
- Xiser Pro Trainer (ステッパー)
- HHKB Professional 墨 (キーボード)
- HHKB キートップセット 白 (キートップ)
- Apple Magic Mouse 2 (マウス)
- Apple MacMini (PC)
- iiyama Display 27inch FullHD (ディスプレイ)
- KINTO UNITEA 550ml (コップ)