Я очень новичок в make-файлах — поэтому, пожалуйста, держите меня в покое и то, как я задаю этот вопрос.
Я использовал make-файл, который был довольно простым. Я определил OBJS со списком файлов .cc. Я установил зависимости и включил флаги и добавил их в $ CXXFLAGS. Это выглядит примерно так:
SRCS = file1.cc file2.cc file3.cc
OBJS = $(SRCS:.cc=.o)
CXXFLAGS=some flags
CXXFLAGS+=some include dirs
$(mylib.so): $OBJS
$CXX -shared -o $@ $^
mylib.so использует CXXFLAGS (неявно), и все прекрасно работает.
У меня недавно была потребность иметь mylib_1.so и mylib_2.so, в дополнение к mylib.so. Каждый .so зависит от всех одинаковых файлов .cc, но все флаги компилятора различны (включая каталоги включения).
Как мне получить его, чтобы я мог установить флаги компилятора на основе цели .so? Проблема, которая у меня есть, состоит в том, что, если я устанавливаю CXXFLAGS более одного раза, он перезаписывается. Это почти как если бы мне нужна ситуация if / else.
Я попытался сделать что-то вроде установки трех разных флагов, $ CXXFLAGS1, $ CXXFLAGS2, $ CXXFLAGS3 и использования их в строке
$(mylib1.so): $OBJS
$CXX $(CXXFLAGS1) -shared -o $@ $^
но это не работает.
Как мне выполнить то, что я пытаюсь сделать? Лучше иметь 3 отдельных make-файла? Я нашел способ заставить его работать. Я могу прекратить использовать $ OBJS и явно указывать флаги для каждого исходного файла, но это кажется ужасной идеей с точки зрения масштабирования по размеру.
Ваш CXXFLAGS1 в вашем примере используется только на этапе создания .so файла, не для компиляции реальных источников C ++ (что я и пытаюсь сделать).
Чтобы достичь вышеизложенного, рассмотрите возможность создания Makefile 3 раза для 3 различных целей и передачи CXXFLAGS (с разными значениями) как часть MAKEFLAGS или в командной строке.
Обновить: вот пример
все: build-lib1 build-lib2 build-lib3 строить-lib1: $ (MAKE) $ (MAKEFLAGS) CXXFLAGS = "$ (CXXFLAGS1)" lib1.so строить-Lib2: $ (MAKE) $ (MAKEFLAGS) CXXFLAGS = "$ (CXXFLAGS2)" lib2.so строить-lib3: $ (MAKE) $ (MAKEFLAGS) CXXFLAGS = "$ (CXXFLAGS3)" lib3.so $ (lib1.so): $ OBJS $ (CXX) -расход -o $ @ $ ^ так далее...
Makefiles может иметь целевые значения переменных. Что-то вроде:
$(mylib1.so): CXXFLAGS += -lib1flags
$(mylib2.so): CXXFLAGS += -lib2flags
$(mylib3.so): CXXFLAGS += -lib3flags
Согласно документации, флаги будут распространяться до обязательных целей.
Есть еще одна особенность целевых переменных: когда
Вы определяете целевую переменную, значение которой также находится в
эффект для всех предпосылок этой цели, и все их
предварительные условия и т. д. (если эти предварительные условия не переопределяют эту переменную
с их собственной целевой переменной значение). Так, например,
утверждение как это:prog : CFLAGS = -g prog : prog.o foo.o bar.o
установит для CFLAGS значение «-g» в рецепте для prog, но также установит
Помечайте «to -g» в рецептах, которые создают prog.o, foo.o и bar.o,
и любые рецепты, которые создают свои предпосылки.
Я бы сделал это с помощью рекурсивного вызова. Я бы использовал два make-файла:
В Makefile
:
все: mylib1.so mylib2.so SRCS: = file1.cc file2.cc file3.cc mylib1.so: $ (SRCS) test -d mylib1 || mkdir mylib1 $ (MAKE) -f ../lib.mak -C mylib1 TARGET = mylib1.so CXXFLAGS = -DMYLIB = 1 cp mylib1 / mylib1.so mylib1.so mylib2.so: $ (SRCS) test -d mylib2 || mkdir mylib2 $ (MAKE) -f ../lib.mak -C mylib2 TARGET = mylib2.so CXXFLAGS = -DMYLIB = 2 cp mylib2 / mylib2.so mylib2.so
В lib.mak
в том же каталоге:
VPATH = .. SRCS: = file1.cc file2.cc file3.cc OBJS: = $ (SRCS: .cc = .o) $ (TARGET): $ (OBJS) $ (CXX) -расход -o $ @ $ ^
Второй make-файл фактически собирает библиотеку, но использует только один набор CXXFLAGS
, Основной make-файл вызывает первый make-файл для каждой версии с отдельным CXXFLAGS
и в отдельном каталоге. VPATH
облегчает компиляцию исходных файлов, которые не находятся в одном каталоге.
Я проверил эту установку с пробным прогоном,
test -d mylib1 || mkdir mylib1 make -f ../lib.mak -C mylib1 TARGET = mylib1.so CXXFLAGS = -DMYLIB = 1 make [1]: вход в каталог `/ home / depp / Maketest2 / mylib1 ' g ++ -DMYLIB = 1 -c -o file1.o ../file1.cc g ++ -DMYLIB = 1 -c -o file2.o ../file2.cc g ++ -DMYLIB = 1 -c -o file3.o ../file3.cc g ++ -shared -o mylib1.so file1.o file2.o file3.o make [1]: выход из каталога `/ home / depp / Maketest2 / mylib1 ' cp mylib1 / mylib1.so mylib1.so test -d mylib2 || mkdir mylib2 make -f ../lib.mak -C mylib2 TARGET = mylib2.so CXXFLAGS = -DMYLIB = 2 make [1]: вход в каталог `/ home / depp / Maketest2 / mylib2 ' g ++ -DMYLIB = 2 -c -o file1.o ../file1.cc g ++ -DMYLIB = 2 -c -o file2.o ../file2.cc g ++ -DMYLIB = 2 -c -o file3.o ../file3.cc g ++ -shared -o mylib2.so file1.o file2.o file3.o make [1]: выход из каталога `/ home / depp / Maketest2 / mylib2 ' cp mylib2 / mylib2.so mylib2.so