2017-04-13 11 views
1

メイクファイルにCソースファイルを含めるときに問題が見つかりました。このCソースファイルには、外部Cリンケージオプションを使用してC++コード(list.cpp)によって呼び出される関数が含まれています。私はこのCソースコードをインクルードするMakefileのどこが正しいかを知りたいと思います。このソースコードはC++コードの中で呼び出されます。私はそれを構築し、その後、C++のコードが正しくCの関数呼び出しを解決するために失敗し、私はリンカエラーを取得していますするために、MakefileののSOURCES変数に、このCファイルを追加しようとした場合:未定義の参照メイクファイル依存ファイルが含まれているとエラーが発生する

後、私のMakefileです内容:

CFLAGS =-c -g -Wall -std=c++11 
SOURCES = list.cpp 
OBJECTS = $(SOURCES:.cpp=.o) 
EXEC = a.out 

all: $(SOURCES) $(EXEC) 

$(EXEC): $(OBJECTS) 
    @$(CXX) $(OBJECTS) -o [email protected] && $(EXEC) 

.cpp.o: 
    @$(CXX) $(CFLAGS) $< -o [email protected] 

答えて

1

のは 、ビルドに必要なCソースファイルがbar.cであると仮定し、それはあなたがlist.cppに-ing #includeある関連するヘッダファイルbar.hを持っており、あなたが正しくコーディングしているということをしてみましょうextern C ボイラープレートbar.h

その後、次のメイクファイルは、何が必要でしょう。

1.使用の即時評価(:ここでは学習のポイントがたくさんあります

CXX_SOURCES := list.cpp 
C_SOURCES := bar.c 
OBJECTS = $(C_SOURCES:.c=.o) $(CXX_SOURCES:.cpp=.o) 

CXXFLAGS := -g -Wall -std=c++11 
CFLAGS := -g -Wall 
CPPFLAGS := 
LDFLAGS := 
LDLIBS := 
EXEC := a.out 

.PHONY: all clean test 

all: $(EXEC) 

test: $(EXEC) 
    ./$< 

$(EXEC): $(OBJECTS) 
    $(CXX) $(LDFLAGS) $^ -o [email protected] $(LDLIBS) 

list.o: bar.h 

clean: 
    rm -f $(EXEC) *.o 

のMakefile :=)ではなく、再帰的評価(=)が である再帰的な評価が必要です。ターゲットは単にタスクの名前ではなく、タスクが作成されます ファイルの名前である場合、それはphony target だ、 6.2 The Two Flavors of Variables

2.を参照してください、あなたはそれが偽りであることをmakeを教えてくださいターゲット、のような:

.PHONY: all clean test 
それはあなたのように、うまく実行 としてプログラムにプログラムを構築するメイクレシピの正常ではない

3.

@$(CXX) $(OBJECTS) -o [email protected] && $(EXEC) 
あなたは常にあなたがそれを構築したという理由だけでプログラムを実行したくない

、および プログラムが実行されている-longまたは対話型のいずれかの場合、このアプローチ はビルドにそれがimpractialようになりますプログラムはまったくありません。

恐らく、正しく構築されたテストにプログラムを実行したいと考えています。 ビルドは1つのタスクですが、テストは別のものです(時間がかかり、追加のリソースが必要です)。テスト用に別の偽のターゲット を提供する必要があります。私はこのメイクファイルでtestと呼ばれています。多くの場合、checkと呼ばれています。 テストせずにプログラムをビルドするには、makeを実行してください。これをテストするには、 を実行してmake test - これをでも(再)をビルドする必要がある場合は、プログラムをビルドします。

4.あなたはname.cからname.oを作るためにname.cpp、または ルールからname.oを作るためのルールを記述する必要はありません。

  • CC::Cのコンパイルやリンクを起動するコマンドを、例えばGNU makeは、限り、あなたは正しく makeは、これらの組み込みルールで使用するメイク変数を設定してきたように、正しく これを行うためのbuiltin rulesを持っていますgcc
  • CXX:C++コンパイルまたはリンケージを呼び出すコマンド。 g++
  • CFLAGS:Cコンパイルするためのオプション
  • CXXFLAGS:C++のコンパイル
  • CPPFLAGSのオプション:C/C++プリプロセッサのオプション

5.従来の持っている二つのより重要なメイク変数意味は:

  • LDFLAGS:リンケージのオプション、exライブラリ(-l)オプション
  • LDLIBS:ライブラリオプション(-l)for linkage。上記の単純なmakefileで

CPPFLAGSLDFLAGSLDLIBSが必要 ではなく、省略さすることができます。代わりに、私は彼らの使用を説明するために空の値 を割り当てました。 make cleanはあなたに最初から何でもまたは全てを構築する準備ができて を取得するよう

6.メイクファイルは、メイクファイルを作成している可能性のあるすべてのファイルを削除します 偽のターゲットcleanを持つ必要があります。

name.oname.cまたはname.cppからコンパイルされている場合、 コースname.oname.cに依存します。 name.cppが含まれていますが、は、が含まれているすべてのヘッダーファイルにも依存します。name.c | name.cpp、および メークファイルは、確実に動作するためには、これらの依存関係をすべて表現する必要があります。あなたがbar.hを変更した場合、その後makefoo.oが 期限が切れて、再作成するfoo.oのためにそのレシピをさせていただきますことを確認するように

list.o: bar.h 

:だから この場合、あなたは(少なくとも)のルールを必要としています。 複雑なプログラムの構築を開始すると、 はこれらのヘッダファイルの依存関係をすべて理解することができません。を参照すると、の自動依存性生成が見つかります。

ここにはthe GNU Make manual

関連する問題