2

クラスAを提供するAaというライブラリを作成しようとしています。このライブラリは、クラスBとCに依存し、すべてそれぞれのファイル(.cpp.hpp)にあります。私は通常、すべてのコードを手動でコンパイルしましたが、ファイルの数が増えるにつれて、makefileを使用したいと思いました。基本的に、私がすることは次のとおりでした:

g++ -c A.cpp
g++ -c B.cpp
g++ -c C.cpp
ar rvs A.a *.o

これを行うmakefileを作成するにはどうすればよいですか?makefilesは呼び出すことさえできますarか?

これは私が試したものです:

CC=g++
CFLAGS=-c -Wall
objects=C.o B.o

all : A.o $(objects) #Creates the library called A.a.
:ar rvs A.a A.o $(objects)

A.o : $(objects) A.hpp A.cpp
:$(CC) $(CFLAGS) A.cpp

B.o : B.hpp B.cpp
:$(CC) $(CFLAGS) B.cpp

C.o : C.hpp C.cpp
:$(CC) $(CFLAGS) C.cpp

しかし、私のar rvs A.a A.o $(objects)命令は実行されていないようです。このmakefileはすべての正しい.oファイルを生成しますが、それらをアーカイブしません。

4

2 に答える 2

3

ルールとパターンを使用して、より一般的にすることができます。

SRC_DIR = .
CPPFLAGS += -g
INCLUDES = -I.

# variant 1
SRCS ?= $(shell find $(SRC_DIR) -name '*.cpp' | sed "s/[^\/]*\/[^\/]*\///")
# variant 2
SRCS = A.cpp B.cpp

%.o : $(SRC_DIR)/%.cpp
    $(CXX) -o $@ $(INCLUDES) $(CPPFLAGS) -c $^

all : A.a

A.a : $(SRCS:.cpp=.o) 
    $(AR) rsv $@ $^
于 2012-09-19T16:33:16.403 に答える
1

さて、私の構文は結局正しいか、少なくともその大部分は正しかったのです。私は、タブを置き換えることができるという間違った前提を持っていました:が、これは明らかに正しくありません。

だから、これは私が望むことをするコードです:

CC=g++
CFLAGS=-c -Wall
objects=B.o C.o

all : A.a

A.o : $(objects) A.hpp A.cpp
    $(CC) $(CFLAGS) A.cpp

B.o : B.hpp B.cpp
    $(CC) $(CFLAGS) B.cpp

C.o : C.hpp C.cpp
    $(CC) $(CFLAGS) C.cpp

A.a : A.o $(objects)
    ar rvs A.a A.o $(objects)
于 2012-09-19T21:44:06.787 に答える