2016-09-09 10 views
1

最初の第2メイクファイルは、私が実際にC++プロジェクトを開始する前に理解しておく必要があるためです。makefilesの最初の試行

/storage/emulated/0/cpptest/test.h

#ifndef TEST_H_DEF 
#define TEST_H_DEF 

class Test { 
    private: 
     int value; 
    public: 
     Test(int); 
     operator int(); 
     Test operator + (Test); 
}; 

#endif 

/storage/emulated/0/cpptest/test.cpp

#include "test.h" 

Test::Test(int new_value): 
    value(new_value) {} 

Test::operator int() { 
    return value; 
} 

Test Test::operator + (Test other) { 
    return Test(value + int(other)); 
} 
:ここで私はリンクをしようとしているファイルです

/storage/emulated/0/cpptest/main.cpp

#include <iostream> 
#include "test.h" 

int main() { 
    Test o1(12); 
    Test o2(18); 
    std::cout << int(o1) << '\n'; 
    std::cout << int(o2) << '\n'; 
    std::cout << int(o1 + o2) << std::endl; 
} 

そして、ここでは(保守性)メイクファイルでの私の試みです

CC = g++ 

default: test 

#I'm actually using four spaces here on SO 
test: main.o test.o 
    $(CC) -o test main.o test.o 

#my issue starts here: what does main.o depends on? My guess is main.cpp only (which is really /storage/emulated...main.cpp) 
main.o: main.cpp 
    $(CC) -o main.o /storage/emulated/0/cpptest/main.cpp 

#same with test.o 
test.o: test.cpp 
    $(CC) -o test.o /storage/emulated/0/cpptest/test.cpp 

次に?今は大丈夫ですか?どのように私はそれについて知っていることなく更新されているtest.hの問題を処理するのですか?

私のファイルを書いている間に、.hと.cppファイルの使用を取得しましたか?

+3

もしあなたが単にC++を使用しようとしていて、makefile上で実際に修正されていないのであれば、ネイティブメイクファイルの代わりにcmakeをお勧めします。たくさんのことが楽になります。 – Hayt

+0

.h依存関係については、ファイルが 'test.o'ルールの依存関係に追加されていれば動作しますか? – Pierre

+0

どのように私はmakefileで修正できますか?私は今朝までメイクファイルの使い方を知らなかった:/それぞれのメリットは? – user6245072

答えて

5

gccが依存関係を生成することがあります。そうではなく、手動ですべての依存関係があなたのソースファイルがコンパイラを使用して、(必然的に間違っているか不完全になる)持っているものを入力して:

default: test 
.PHONY : default 

compiler := g++ 
objects := main.o test.o 
depends := $(objects:.o=.d) 

# include the depends rules if they exist 
-include $(depends) 

# test depends on all the objects, compiled together 
test : $(objects) 
    $(compiler) -o [email protected] $^ 

# each object depends on its source file 
# the recipe here will both compile the source file and generate its dependencies 
%.o : %.cpp 
    $(compiler) -o [email protected] -c $< -MP -MMD -MF $(@:.o=.d) 

これはあなたのためのファイルが生成されますと、メイクファイルルールが含まれるmain.dtest.dの名前実際の依存関係はmain.cpptest.cppです。


あなたのメイクファイルの妥当性について疑問にいるときはいつでも、それはmake -pnを実行し、そこに印刷されているすべてを調査するために、常に便利です。それはあなたの依存関係が完全に正しいものであることを確認するのに役立ちます。

たとえば、コンパイル時最初に、*.dファイルが存在しないので、include $(depends)コマンドは(黙っているため-includeの)失敗し、このメイクファイルは次のようになり、依存関係のグラフ作成:

enter image description here

子どもが更新されている場合は、いずれかのノードがレシピを再実行する必要があるので、これをお読みください(defaultは青いルールなので青です)。したがってmain.cppが更新されるたびにmain.oを再コンパイルする必要があります。 test.hに依存しないことに注意してください。これは間違いのように思えるかもしれませんが、とにかくすべてを再コンパイルしなければならないので、私たちは逃しません。我々が最初にコンパイルした後、我々は*.dファイルを生成しているだろうし、我々は、我々が含まにそれらを持参し、新たな依存関係グラフは次のようになります。まさに私たちが望むものである

enter image description here

を。

+0

まあ、学んでいる間にあなたがやる拳のことじゃないけど、それはほぼ普遍的です! –

+0

これは私が探していたものより少し進んでいますが、それでも知っているのはうれしいです。ご回答有難うございます。 – user6245072

+0

@ user6245072 Makeを使うつもりなら、このような "先進的"なものを置かなければならないのではないかと思います。他の答えからの手作業のアプローチは、自明ではないプロジェクトでは維持できなくなります。 –

1

TEST.Hの依存性がTEST.CPPとメインのcppの両方のためのものです:

CC = g++ 

default: test 

test: main.o test.o 
    $(CC) -o test main.o test.o 

main.o: main.cpp test.h 
    $(CC) -o main.o /storage/emulated/0/cpptest/main.cpp 

test.o: test.cpp test.h 
    $(CC) -o test.o /storage/emulated/0/cpptest/test.cpp 

アイデアは何かがtest.h以内に変更された場合test.omain.oの両方を作り直さなければならないということです。

+0

downvotersはここで何が間違っているのか指定できますか?私はあなたの方法を知っているだけでなく、OPの出発点も考慮する。 –

+1

OPの出発点を考えれば、彼をどこにでも連れて行くような、まったく維持できない "解決策"をちょうどやり遂げるのは悪い考えです。これはこの答えを "役に立たない" * - > dvにします。 –

+0

@BaummitAugen:誰もが最初のプログラムとしてApollo11​​ミッションコントローラーを書いているわけではありません! –

関連する問題