В примере 1.18 VPATH
.
VPATH = <путь-к-файлам-cpp>
Чтобы сказать vpath
.
# искать файлы .exp в ../lib
vpath %. exp../lib
Рецепты 1.2 и 1.7.
1.16. Сборка статической библиотеки с помощью GNU Make
Вы хотите использовать GNU
Вначале в директории, где должна быть создана статическая библиотека, создайте make-файл и объявите фиктивную цель all
, единственным пререквизитом которой будет статическая библиотека. Затем объявите цель статической библиотеки. Ее пререквизитами должны быть объектные файлы, входящие в состав библиотеки, а ее командный сценарий должен представлять собой командную строку для сборки библиотеки из набора объектных файлов, аналогично показанному в рецепте 1.3. При использовании GCC или компилятора с похожим синтаксисом командной строки настройте, если требуется, неявные правила шаблонов, изменив одну или более переменных CXX
, CXXFLAGS
и т.п., используемых в базе данных неявных правил install
и clean
, как показано в рецепте 1.15.
Например, чтобы с помощью GCC в Unix собрать из исходных файлов, перечисленных в примере 1.2, статическую библиотеку, создайте в директории
# Укажите расширения файлов, удаляемых при очистке
CLEANEXTS - о а
# Укажите целевой файл и директорию установки
OUTPUTFILE = libjohnpaul.a
INSTALLDIR = ../binaries
# Цель по умолчанию
.PHONY: all
all: $(OUTPUTFILE)
# Соберите libjohnpaul.a из john.o. paul.o и johnpaul.с
$(OUTPUTFILE): john.o paul.o johnpaul.о
ar ru $@ $^
ranlib $@
# Для сборки john.o, paul.o и johnpaul.о из файлов .cpp
# правила не требуются; этот процесс обрабатывается базой данных
# неявных правил make
.PHONY: install
install:
mkdir -p $(INSTALLDIR)
cp -p $(OUTPUTFILE) $(INSTALLDIR)
.PHONY: clean
clean:
for file in $(CLEANEXTS); do rm -f *.$$file; done
# Укажите зависимости файлов cpp от файлов .hpp
john.o: john.hpp
paul.o: paul.hpp
johnpaul.o: john.hpp paul.hpp johnpaul.hpp
Аналогично, чтобы собрать статическую библиотеку с помощью Visual С++, ваш make-файл должен выглядеть, как показано в примере 1.21.
# Укажите расширения файлов, удаляемых при очистке
CLEANEXTS = obj lib
# Specify the target file and the install directory
OUTPUTFILE = libjohnpaul.lib
INSTALLDIR = ./binaries
# Шаблонное правило для сборки объектного файла из файла .cpp
%.obj: %.cpp
'$(MSVCDIR)/bin/cl' -с -nologo -EHsc -GP -Zc:forScope -Zc:wchar_t
$(CXXFLAGS) S(CPPFLAGS) -Fo'$@' $<
# Фиктивная цель
.PHONY: all
all: $(OUTPUTFILE)
# Соберите libjohnpaul.lib из john.obj, paul.obj и johnpaul.obj
$(OUTPUTFILE): john.obj paul.obj johnpaul.obj
'$(MSVCDIR)/bin/link' -lib -nologo -out:'$@' $^
.PHONY: install
install:
mkdir -p $(INSTALLDIR)
cp -p $(OUTPUTFILE) $(INSTALLDIR)