2

我正在尝试创建一个名为 Aa 的库,它提供一个类 A,它依赖于类 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

好的,所以我的语法毕竟是正确的,或者至少大部分是正确的。我提出了一个错误的前提,即:'s 可以替换选项卡,这显然是不正确的。

所以,这是我想要的代码:

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 回答