2017-04-18 11 views
-3

私は、メイクファイルを使って、自分のC++プロジェクトファイルを簡単にコンパイルするために統合しようとしています。しかし、私はここでいくつかの問題に直面しています。私は、通常のプログラム構造を含むmain_prog.cpp,のinclude.h,some_class.cppのようないくつかのC++ファイルを持っています。今私のメイクは次のようになります。C++クラスを使用したメークファイル

all: main_proj.o some_class.o include.h 
    g++ main_proj.o some_class.o -o a.out 

main_proj.o: main_proj.cpp some_class.o include.h 
    g++ main_proj.cpp some_class.o -o main_proj.o 

some_class.o: some_class.cpp include.h 
    g++ some_class.cpp -o some_class.o 

しかし、それはsome_class.oメイン()を見つけることができないとして、このメイクファイルは動作しません。 エラー:

$ make 
g++ some_class.cpp -o some_class.o 
/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crt1.o: In function `_start': 
(.text+0x20): undefined reference to `main' 
collect2: error: ld returned 1 exit status 
makefile:20: recipe for target 'some_class.o' failed 
make: *** [some_class.o] Error 1 
$ 

これは問題です。正しい依存関係の順序は?

答えて

1

コマンド

g++ main_proj.cpp some_class.o -o main_proj.o 

main_proj.cppファイルをコンパイルしsome_class.oオブジェクトファイルとそれにをリンクし、実行可能なプログラムmain_proj.oを生成するために、GCCに指示します。

ソースファイルmain_proj.cppは、-cオプションを使用してオブジェクトファイルにコンパイルするだけです。だから、完全なルールとコマンドが

main_proj.o: main_proj.cpp include.h 
    g++ main_proj.cpp -c -o main_proj.o 

ようになるはずです[some_class.oオブジェクトファイルは、このルールではもう使われていないことに注意してください。]

some_class.oオブジェクトファイルを生成するために同じことを行います(つまり、-cフラグを追加します)。


本当にあなたが期待どおりに機能し、構築するためのmakefileを得た後、あなたはread the make documentationに継続すべき

.PHONY: all 
all: a.out 

a.out: main_proj.o some_class.o 
    g++ main_proj.o some_class.o -o a.out 

のようなものであるべき最初のルール、との問題もあります暗黙のルール、変数、自動変数などについて学ぶことができます。それで、あなたはmakefileを非常に汎用的で、拡張して再利用するのを容易にすることができます。

オブジェクトファイルを作成するときにさらにフラグを追加し、警告をさらに生成するようにコンパイラに指示することをお勧めします。警告はエラーと似ていますが、技術的には有効ですが、実行中に問題が発生する可能性があります。私は個人的に常に少なくとも-Wall-Wextraフラグを使用します。

1

別のオブジェクトファイルを生成するためにオブジェクトファイルは必要ありません。 オブジェクト・ファイルを生成し、オブジェクトファイル中に、実行ファイルを生成している場合にのみ必要ですあなただけのソースすなわち*.h*.cpp

main_proj.o: main_proj.cpp include.h 
    g++ main_proj.cpp -c -o main_proj.o 
を提供する必要があります
関連する問題