- 締切済み
エラー Permission denied
現在、mingwで94個のプログラムをコンパイルするのにGNUMAKEを使っています。 make all で登録されたプログラムを全コンパイルすると、 その過程で133個のオブジェクトファイルが作られるのですが、途中で次のようなエラーが発生することがあります。 「することがある」というのが厄介な点で、ソースコードを一切変更せずに同じ操作をしても、 エラーが出るタイミングが違うのです。 まったくエラーの出ないこともありますが、たいがいは中盤で次のようなメッセージを出力して停止します。 gcc --input-charset=cp932 --exec-charset=cp932 -Wall -s -O3 -Os -c -o atgc_ratio.obj atgc_ratio.c gcc --input-charset=cp932 --exec-charset=cp932 -Wall -s -O3 -Os -c -o Lib-atgc_count.obj Lib-atgc_count.c gcc -Os -o atgc_ratio.exe atgc_ratio.obj Lib-klonoa.obj Lib-arg2.obj Lib-strdata.obj Lib-log.obj Lib-strdata2.obj Lib-atgcarryget2.obj Lib-atgc_count.obj Lib-file.obj Lib-calender.obj Lib-command.obj c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: reopening atgc_ratio.exe: Permission denied c:/mingw/bin/../lib/gcc/mingw32/4.7.2/../../../../mingw32/bin/ld.exe: final link failed: Permission denied collect2.exe: error: ld returned 1 exit status make: *** [atgc_ratio.exe] Error 1 上記の例ですと、atgc_ratio.exe をコンパイルしている最中に、「Permission denied」なるものが発生し、makeが動作停止しているものと解釈しております。 再度make all すると何事も無かったかのようにatgc_ratio.exeに必要なオブジェクトファイルをリンクして作業を続行します。 borland C++ compiler 5.5.1(古い!!)でも時たま同じようなエラーが発生するようですが、 そもそもこっちは12年前からバージョンアップしてないので、しょうがないかな?と思います。 一応、-Wall で無警告になるようメンテナンスはしているので、ソースコード自体の問題ではないと思います。 何らかのソフトがファイルをロックしているのかと思い、とりあえずアンチウィルスソフトを一時的に停止してみましたが、 やはりエラーは出ました。 マルチスレッドの問題?とも思ったのですが、マルチスレッドとかマルチコアなどの分野に手を出したことがありませんので見当がつかない状態です。 また最近シングルCPUのWinXP環境から Intel(R) Core(TM) i3-3110M CPU @ 2.40GHz のWin7(32ビット)に移行したばかりで、 マルチCPUなどの使用経験も非常に浅いので、windowsの問題か、コンパイラの問題か、makeなど開発環境の問題か、原因の切り分けができておりません。 これらの問題の原因や対策について詳しい方、ご教授いただければと思います。 現在の環境を次にまとめます。 OS:Windows 7 Professional 32ビット版 (Serbice Pack1) 開発環境:mingw 4.7.2 (mingw-get-inst-20120426.exe を使って最新版をダウンロードしたもの) コンパイラ:gcc 4.7.2 リンカ:GNU ld (GNU Binutils) 2.23.1 make:GNU Make 3.81 gcc -v の結果 Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.7.2/lto-wrapper.exe Target: mingw32 Configured with: ../gcc-4.7.2/configure --enable-languages=c,c++,ada,fortran,obj c,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgo mp --disable-win32-registry --enable-libstdcxx-debug --disable-build-poststage1- with-cxx --enable-version-specific-runtime-libs --build=mingw32 --prefix=/mingw Thread model: win32 gcc version 4.7.2 (GCC) make -v の結果 GNU Make 3.81 Copyright (C) 2006 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. This program built for i686-pc-msys オブジェクトのコンパイルには次のコマンドを使っています。 gcc --input-charset=cp932 --exec-charset=cp932 -Wall -s -O3 -Os -c -o リンクには次のコマンドを使っています。 gcc -Os -o なお、gccはデフォルトではオブジェクトファイルの拡張子を.oにしますが、 borland C++ も使う関係で、-oオプションでファイル名を直接指定して拡張子を統一しています。 どうかよろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- racene
- ベストアンサー率70% (21/30)
なかなか難しそうですね。 Permission denied はファイルへの書き込みや読み込みの権限が得られなかったときに出ますので、今回の場合ですと atgc_ratio.exe を開くことができなかったということになります。 他のアプリケーション等が atgc_ratio.exe を利用していたため、ロックされていて開けなかったというのが最も有力ですね。 ただ、"re"opening atgc_ratio.exe なのが気になりますが・・・ お力になれず申し訳ありません。
お礼
ありがとうございました。決定的な解答を探しているうちにお礼の方を忘れておりまして申し訳ありません。 この問題は結局Mingwのgccの不具合のようですが(ドライブを決め打ち?しているとか)いまだに修正されていません。gccのソースも入手してみたのですが、理解の範疇を超えていましたので、残念ながら”PCに負荷がかかっていない状態でコンパイルする”以上の手はいまだに見つかっておりません。gcc version 8.2.0の現在も、時々Permission deniedがありますが、頻度は減りました。