Как составить библиотеки с помощью Gnu make?

Я пытаюсь создать библиотеку с именем A.a, которая предоставляет класс A, который зависит от классов B и C, все в своих соответствующих файлах (.cpp а также .hpp). Обычно я компилировал весь свой код вручную, но по мере увеличения количества файлов я хотел использовать make-файл. По сути, я бы сделал следующее:

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

Как я могу создать make-файл, который делает это? Может сделать файлы даже позвонить 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 файлы, но не архивирует их.

2

Решение

Вы можете использовать правила и шаблоны, чтобы сделать его более общим:

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 $@ $^
3

Другие решения

Итак, мой синтаксис был верным, или, по крайней мере, большая его часть была. Я ошибся в предположении, что :может заменить вкладки, что, по-видимому, в конце концов не правильно.

Итак, это код, который делает то, что я хочу:

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)
1