2016-06-22 2 views
4

私は以下の質問をしています。コンパイルが成功した後、.hファイルの内容を変更しただけでもう一度コンパイルすると、コンピュータは次のように表示します。C++で変更された.hファイルを再度コンパイルする必要はありませんか?

make: `all 'には何もしません。

.hファイルのみを変更してもコンパイラに強制的にコンパイルを強制できますか?

+1

あなたの依存関係が正しく設定されている場合は、 'make'プログラムは任意のヘッダ場合は、再度コンパイルする必要がありますまたはソースファイルが変更されます。 –

+1

@Thomas Matthews明らかに、この場合、依存関係は正しく設定されていません。 –

+0

ヘッダーファイルが変更された場合にOPが再構築を強制したいので質問を解釈すると、より面白い(または挑戦的な)問題になります。 –

答えて

4

ヘッダファイルが変更されたとき、あなたの出力を更新することにしたい場合は、あなたの依存関係の声明にそれを追加する必要があります。

myprogram: myprogram.cpp myprogam.h 
     c++ -o myprogram myprogram.cpp 

一般的に我々は、このようにそれをしないことを行い、コードので、 cppファイルにとどまります。 Unix上で再構築を強制したい場合は、cppファイルに触れて(例えば、再構築を強制的に)「touch myprogram.cpp」でタイムスタンプを更新するか、既存の実行可能ファイルを削除します。

メークファイルを使わずにmakeを使用している場合、依存関係を推測すると、ヘッダーの依存関係は推定されません。この場合は、実行ファイルを吹き飛ばしたり、ソースファイルに触れたりしてください。

+2

また、私の3分Makefileチュートリアル:https://gist.github.com/VirtualMe/6194181 –

+0

実行ファイルを削除するだけでなく、オブジェクトファイルではなく、再リンクを強制する再コンパイル?したがって、問題を解決していない。 –

+0

中間のオブジェクトファイルなしで私の例のように単純なコンパイルを想定していました。もちろん、オブジェクトファイルだけが依存関係リストにあれば、再リンクするだけです。 –

3

Makefileのようなサウンドは、依存関係が正しく設定されていません。それはあなたが修正を検討する必要があります。

基本的な問題を修正するのではなく、強制的に再構築を強制したい場合は、次にmake allの前にmake cleanを実行するか、Makefileに "クリーン"なターゲットがない場合は、生成されたオブジェクトファイルとlibs /実行可能ファイルをすべて削除してからmake allを再度実行します。

+2

これはコメントでなければなりません。それは質問に答えません。 – AndyG

+0

ありがとうございます。私は答えを更新しました:) –

+0

ありがとう!私はOPの問題は、彼らが依存関係を修正すると解決される可能性があることに同意しますが、問題の核心は実際には面白いです:.hファイルが変更された場合、再構築を強制します。これは私がオフハンドのやり方を知らないもので、誰かの答えを見ることに興味があります。ビルドする前に「クリーン」を実行することは、大げさなアプローチです。 – AndyG

2

コマンドラインオプションを使用して、makeにすべてを再構築させることができます。

しかし、Makefileに依存関係を正しく設定していないようです。コード(.cppファイル)にヘッダーが実際に含まれている場合は、一般的にそれらのコンパイル対象にはヘッダーファイルの前提条件が必要です。

0

.hファイルを変更しただけでコンパイラを強制的にコンパイルすることはできますか?

はい...しかし、おそらくmake(ツール)を改善したいと考えています。

私が行うのは、makeによって生成されたコマンドが表示されている、問題のファイルの最新のコンパイルを強制することです。

例:

# ... noise 

g++ -O3 -ggdb -std=c++14 -Wall -Wextra -Wshadow -Wnon-virtual-dtor -pedantic -Wcast-align -Wcast-qual -Wconversion -Wpointer-arith -Wunused -Woverloaded-virtual -O0 lmbm101_11.cc -o lmbm101_11 -L../../bag -lbag_i686 -lnet_i686 -lposix_i686 -lzlib_i686 -lrt -pthread 

# ... more noise. 

ビルドを強制するためには、私は「コマンド」(「グラム++」で始まり、騒音や、よりノイズの間に存在する)を作成します、これを代わりに呼び出しを強調しましたメイクの

これは、Linuxでemacsを使用するのは簡単です。他のシステムではそれほど簡単ではないかもしれません。

将来の使用のために、このコマンドをファイルにコピーすることを検討してください。

(つまり、makeファイルを修正するまで私はmakeをバイパスします。)

0

受け入れられた答えよりも簡単な方法があります。単純にMakefileのコンパイラフラグに-MDを追加し、Makefileの最後に-include myfile.dを追加します(代わりに* .d拡張子を持つすべてのソースファイルをリストします)。これはそれぞれ、makeのビルドフォルダ(どこに* .oファイルがあるか)に* .d依存ファイルを生成して参照するので、メイクファイルの依存関係にすべてのヘッダファイルを明示的に追加する必要はありません。

これは、長いヘッダーファイルのリストを持つプロジェクトに役立ちます。さらに、この方法では、ヘッダーファイルを変更したときにバイナリが更新されたと思ったときにトラブルシューティングの時間が失われるのを防ぐため、ヘッダーファイルをMakefileの依存関係に含めることを忘れることはできません。それをMakefileに入れます。

たとえば、gcc -MD -I. -c myfile.cpp -o obj/myfile.oを使用して、foo: myfile.cppのように、メイクファイルの依存関係をmyfile.hなしに保つことができます。

あなたは一度だけ、すべてのファイルを一覧表示する必要があるので、これを行うためのショートカットの方法は、以下のようなものです:

# Beginning of Makefile etc. etc. 

# Only need to list all files once, right here. 
SRCS = myfile.cpp myfile2.cpp 

OBJS = $(SRCS:%.cpp=%.o) 

# put .o and .d files in ./obj/ 
FULLOBJS = $(addprefix obj/,$(OBJS)) 

# rule to make object (*.o) files 
$(FULLOBJS): obj/%.o:%.cpp 
    gcc -MD -I. -c %< -o [email protected] 

# rule to make binary 
foo: $(FULLOBJS) 
    g++ -o [email protected] $(FULLOBJS) 

# rule to clean (Note that it also deletes *.d files) 
.PHONY: clean 
clean: 
    -rm -rf $(FULLOBJS) foo $(FULLOBJS:%.o=%.d) 

# include dependency files (*.d) if available 
-include $(FULLOBJS:%.o=%.d) 
+0

ファイルを手動でリストするのを避けるには、 'SRCS = $(shell find。-name '* .cpp')'を実行することができます。 –

関連する問題