2017-04-24 6 views
0
EXENAME = prog1  
OBJS = link.o main.o 

CXX = clang++ 
CXXFLAGS = -Wall -Wextra 

LD = clang++ 

all : $(EXENAME) 

$(EXENAME) : $(OBJS) 
    $(LD) $(OBJS) -o $(EXENAME) 

main.o : link.h main.cpp 
    $(CXX) $(CXXFLAGS) main.cpp 

link.o : link.h link.cpp 
    $(CXX) $(CXXFLAGS) link.cpp 

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

これはメイクファイルですが、リンク内のすべての関数をメインで呼び出すことはできません。私は多くの異なる方法が動作しないしようとしました。これは動作しますC++メイクファイルはリンクされていません

prog1: main.cpp link.h link.cpp 
    clang++ -Wall -Wextra -o prog1 main.cpp link.cpp 

しかし、私はこれを行う正しい方法ではないと思いますか?

答えて

2

あなたが入手したエラーの少なくともいくつか(おそらく最初の数個)を提供した場合、それは役に立ちます。

オブジェクトファイルをビルドするためのコンパイラ呼び出しが間違っています。他のフラグを指定しなければ、コンパイラはすべての入力ファイルを取り込み、実行可能ファイルを作成しようとします。だから、このルール:

main.o : link.h main.cpp 
     $(CXX) $(CXXFLAGS) main.cpp 

は、このコンパイルラインに展開:

clang++ -Wall -Wextra main.cpp 

(つまり、ここに記載されているということすべてですので、のみ)コンパイラが実行ファイルにとリンクmain.cppファイルをコンパイルしようとしますa.out(デフォルト)。 link.oを構築するための

main.o : link.h main.cpp 
     $(CXX) $(CXXFLAGS) -c main.cpp 

同上:あなたがオブジェクトファイルを構築するのではなく、プログラムをリンクしたい場合

は、あなたのコンパイルラインに-cオプションを追加する必要があります。

独自のファイルを作成するのではなく、オブジェクトファイルをコンパイルするためにmakeの組み込みルールを使用するだけです。その場合、メイクファイル全体は次のようになります。

EXENAME = prog1  
OBJS = link.o main.o 

CXX = clang++ 
CXXFLAGS = -Wall -Wextra 

all : $(EXENAME) 

$(EXENAME) : $(OBJS) 
     $(CXX) $(CXXFLAGS) $(OBJS) -o $(EXENAME) 

main.o : link.h 
link.o : link.h 

clean : 
     -rm -f *.o $(EXENAME) 
関連する問題