諸事情あって、C言語のコンパイルするファイルを(vpathで指定せずに)カレントディレクトリにコピーしてから、コンパイルを実行したいと思っています。
以下のように、compile_pre でコピー、compile_main でgcc を起動しているのですが、main.oがコンパイルできない旨、エラーで終了してしまいます。
これはどうしてなのでしょうか?
(compile_pre → comple_main の順番には実行しないのでしょうか?)
また、このようなことをしたいばあい、何か良い方法はありませんでしょうか。
-----------------------------------------------
# (src/main.c から main.o を生成して、main.exe を生成する)
TARGET = main.exe
TARGET_OBJS = main.o
#TARGET_OBJS += sub.o ...
.PHONY: compile compile_pre compile_main
compile: compile_pre compile_main
compile_pre:
cp -fp ./src/main.c .;
compile_main: $(TARGET)
$(TARGET): $(TARGET_OBJS)
gcc -o $(TARGET) $(TARGET_OBJS)
%.o : %.c
gcc -c -o $@ $<
-----------------------------------------------
UNIX%> make compile --dry-run --debug
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-linux-gnu
Reading makefiles...
Updating goal targets....
File `compile' does not exist.
File `compile_pre' does not exist.
Must remake target `compile_pre'.
cp -fp ./src/main.c .;
Successfully remade target file `compile_pre'.
File `compile_main' does not exist.
File `main.exe' does not exist.
File `main.o' does not exist.
Must remake target `main.o'.
make: *** No rule to make target `main.o', needed by `main.exe'. Stop.
宜しくお願い致します。
A 回答 (5件)
- 最新から表示
- 回答順に表示
No.2
- 回答日時:
>(compile_pre → comple_main の順番には実行しないのでしょうか?)
しません。
>compile: compile_pre compile_main
「compile は、compile_pre と compile_main に依存している」という事であって
「compile の実行には、先に compile_pre, compile_main の順に実行する」ではありませんから。
ありがとうございます。
No3 で書きましたが、
> 「compile の実行には、先に compile_pre, compile_main の
> 順に実行する」ではありませんから。
は少なくとも GNU makeの実装とは違います。
「compile_pre, compile_main の順に実行する」が正解です。
No.3
- 回答日時:
ちょいと確認しましたが, GNU make では #2 で言われるように依存ファイルの間の順序は「決まっていない」ということなので, 今の場合 compile_pre と compile_main のどちらを先に処理するかわかりません. 必要ならさらに依存関係を追加する必要がありますね.
かつての make では, 必ず compile_pre を先に作り直したものですが.
あと, この最後のエラーは実質的に「『main.o を作るために必要なファイル』を作る方法がわからない」と言っているんだと読むといいかな.
この回答への補足
自分でも少ししらべてみました。
> GNU make では #2 で言われるように依存ファイルの間の順
> 序は「決まっていない」ということなので,
は、手元の書籍と見解が違います。
「GNU make 第3版 6章 大きなプロジェクトの管理」p110 によると
> 複数の必須項目が同じ行に書かれていた場合、GNU make はそれらを
> 左から右に更新します。
ご指摘は間違えだと考えます。
No.4
- 回答日時:
よーく読んでください。
http://linuxjm.sourceforge.jp/html/GNU_make/man1 …
でもいいです。
--dry-runの説明、なんと書いてありますか?
素直にVPATH使うとか(Makefile中に書けないならコマンドラインで指定するとか)、main.cのシンボリックリンクを作るとか、同等のことをするやり方はいくらでもあります。
No.5
- 回答日時:
>%.o : %.c
を
%.o : src/%.c
にするだけでもコピーなんてしなくても良くなりますけど。
#3へ
-jオプションの並列処理がありますから、その関係で順番はなくなったんじゃないでしょうか。
ありがとうございます。
ま、諸事情あってのことなので、そう簡単でもありません。
結局正解がでませんでしたが、このmake が動作しない理由は「GNU make 第3版 3.4 変数はいつ展開されるか」にヒントがありました。
make の内部処理は2段階に分かれていて、1段目のファイルチェックの段階ではコピーは実行されてないため、ファイルの依存関係グラフを作成する際にエラーとなるということです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- オープンソース stable diffusionのインストールがうまくいきません。 1 2023/06/20 13:09
- その他(プログラミング・Web制作) pythonのエラーについて 2 2022/08/17 17:17
- C言語・C++・C# アセンブラ指令 3 2023/06/17 14:47
- 英語 英文の添削をお願いします 4 2023/05/23 11:10
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
- その他(プログラミング・Web制作) x86_32のGASの擬似命令 3 2023/06/07 19:55
- オープンソース Vue+Laravelのデザインテンプレートのサンプルが起動できない 1 2022/05/18 21:52
- HTML・CSS テキストを画面の真ん中に配置したいです。 2 2022/11/25 16:11
- Visual Basic(VBA) フレームワーク「4.8.1」で、[Sub Main]が動かない。助けて下さい 3 2022/11/14 15:40
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
1 つ以上の複数回定義されてい...
-
” OS ビルド ” の意味が分か...
-
<math.h>があるのにsqrtが・...
-
「fatal error C1189」を回避す...
-
必要なDBG ファイルが見つから...
-
Makefile作成時の拡張子.oとは?
-
動的な変数名のつけ方について
-
Microsoft の Visual C++ サン...
-
外部シンボル "_main"は未解決です
-
クリティカルエラー Expressio...
-
2G以上のファイル操作
-
Borland C Builder とOpenCVを...
-
C++/CLIで、アンマネージC++のD...
-
アプリケーションの配布
-
VC60とVC70の違いは?
-
VMwareのLinuxでコンパイルでき...
-
複数のサブディレクトリを一緒...
-
コンパイルエラー
-
NOTIFYICONDATAについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBAを何回も作り直して、容量が...
-
<math.h>があるのにsqrtが・...
-
” OS ビルド ” の意味が分か...
-
Makefile作成時の拡張子.oとは?
-
「fatal error C1189」を回避す...
-
1 つ以上の複数回定義されてい...
-
ILSpyで、デコンパイルできない。
-
C言語でヘッダファイルにグロー...
-
エクセルVBAではRound...
-
セミコロンについて
-
マクロ コンパイルがグレーバック
-
C++コンパイル時に『 C1083: in...
-
外部シンボル "_main"は未解決です
-
PRO*C コンパイルエラー
-
コンパイルエラー:ユーザ定義...
-
クリティカルエラー Expressio...
-
ビルドとリビルドの違いを教え...
-
RPGでプログラムからソースファ...
-
戻り値について
-
C++のhppファイルをCでinclude
おすすめ情報