2016-06-18 18 views
1

私は単純なアプリケーションをコンパイルするためにmakefileを使用しています。ここにあります:gnu g ++で静的ライブラリをリンクする:そのようなファイルやディレクトリはありません。Makefile

CURRDIR = `basename $(PWD)` 
MAINAPP = main 
SECTION = section 
POINT = point 
FIGURE = figure 
CIRCLE = circle 
TRIANGLE = triangle 
RECTANGLE = rectangle 

MAINSRC = $(MAINAPP).cpp 
SECTIONSRC = $(SECTION).cpp 
CIRCLESRC = $(CIRCLE).cpp 
TRIANGLESRC = $(TRIANGLE).cpp 
RECTANGLESRC = $(RECTANGLE).cpp 

MAINKOM = $(MAINAPP).o 
SECTIONKOM = $(SECTION).o 
CIRCLEKOM = $(CIRCLE).o 
TRIANGLEKOM = $(TRIANGLE).o 
RECTANGLEKOM = $(RECTANGLE).o 

SECTIONHEADER = $(SECTION).h 
POINTHEADER = $(POINT).h 
CIRCLEHEADER = $(CIRCLE).h 
TRIANGLEHEADER = $(TRIANGLE).h 
RECTANGLEHEADER = $(RECTANGLE).h 
FIGUREHEADER = $(FIGURE).h 

MAINEXE = $(MAINAPP).x 

COMPILER = g++ 
COMPILERCOPTIONS = -Wall -c 

LINKER = $(COMPILER) 
LINOP = -Wall 
BIBSTAT = libfigures.a 

BIBKOM = section.o triangle.o rectangle.o circle.o 
AR = ar 
AROP = rv 

$(BIBSTAT): $(BIBKOM) 
    $(AR) $(AROP) [email protected] $? 

all: $(MAINEXE) 

$(SECTIONKOM): $(SECTIONSRC) 
    $(COMPILER) $(COMPILERCOPTIONS) $(SECTIONSRC) 
$(CIRCLEKOM): $(CIRCLESRC) 
    $(COMPILER) $(COMPILERCOPTIONS) $(CIRCLESRC) 
$(TRIANGLEKOM): $(TRIANGLESRC) 
    $(COMPILER) $(COMPILERCOPTIONS) $(TRIANGLESRC) 
$(RECTANGLEKOM): $(RECTANGLESRC) 
    $(COMPILER) $(COMPILERCOPTIONS) $(RECTANGLESRC) 

$(MAINKOM): $(MAINSRC) $(SECTIONHEADER) $(POINTHEADER) $(CIRCLEHEADER) $(TRIANGLEHEADER) $(RECTANGLEHEADER) $(FIGUREHEADER) 
    $(COMPILER) $(COMPILERCOPTIONS) $(MAINSRC) 

$(MAINEXE): $(MAINKOM) $(SECTIONKOM) $(CIRCLEKOM) $(TRIANGLEKOM) $(RECTANGLEKOM) $(BIBSTAT) 
    $(LINKER) -o [email protected] $(LINOP) $^ $(MAINEXE) $(MAINKOM) $(SECTIONKOM) $(CIRCLEKOM) $(TRIANGLEKOM) $(RECTANGLEKOM) 

run: $(MAINEXE) 
    ./$(MAINEXE) 

clean: 
    rm -f a.out *~ *.o *.x 

tar: clean 
    (cd ..; tar cvzf $(CURRDIR).tar.gz $(CURRDIR); ls -altr) 

しかし、私は静的ライブラリをリンクすることに問題があるようです。

$ make all 
g++ -Wall -c main.cpp 
g++ -Wall -c section.cpp 
g++ -Wall -c circle.cpp 
g++ -Wall -c triangle.cpp 
g++ -Wall -c rectangle.cpp 
ar rv libfigures.a section.o triangle.o rectangle.o circle.o 
ar: creating libfigures.a 
a - section.o 
a - triangle.o 
a - rectangle.o 
a - circle.o 
g++ -o main.x -Wall main.o section.o circle.o triangle.o rectangle.o libfigures.a main.x main.o section.o circle.o triangle.o rectangle.o 
g++: error: main.x: No such file or directory 1 
make: *** [main.x] Error 1 

すべてのアイデアは、私はこのメイクと間違って何をやっている:これはmake allを実行した後、私の出力のですか?

+0

'G ++ -o main.x ... main.x ...'奇妙に見えます。 main.xはmain.xに依存していますが、明らかに存在しません。 –

答えて

1

あなたの最後のコマンドが

g++ -o main.x -Wall main.o section.o circle.o triangle.o rectangle.o \ 
     libfigures.a main.x main.o section.o circle.o triangle.o \ 
     rectangle.o 

あまりあり、ここで起こっているのである:(2)両方のオブジェクトを使用して二度、あなたは(1)各オブジェクトを繰り返して、そこから構築されたライブラリーは、(3)で出力ファイルを使用します入力ファイルのリスト

それはおそらく、このようなmakefileのルールを変更する必要が

g++ -o main.x main.o libfigures.a 

次のようになります。

$(MAINEXE): $(MAINKOM) $(BIBSTAT) 
    $(LINKER) -o [email protected] $^ 
+0

どうもありがとうございました。今それは動作します! :) – yak

関連する問題