我正在尝试创建一个名为A.a的库,它提供了一个类A,它依赖于类B和C,它们都在各自的文件中(.cpp
和.hpp
)。我通常手动编译所有代码,但随着文件数量的增加,我想使用makefile。基本上,我会做的是:
g++ -c A.cpp
g++ -c B.cpp
g++ -c C.cpp
ar rvs A.a *.o
如何构建一个执行此操作的makefile? makefile甚至可以调用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
文件,但不归档它们。
答案 0 :(得分: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 $@ $^
答案 1 :(得分: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)