Я сталкиваюсь с интересным поведением в унаследованном make-файле, который пытаюсь развернуть для моего текущего проекта.
LIBS := lib/precompiled1.a lib/precompiled2.a lib/mylib1.a lib/mylib2.a
mylib1-src := (source directory)
mylib1-obj := $(patsubst $(mylib1-src)/%.c, obj/LIB1/%.o, $(wildcard $(mylib1-src)/*.c))
mylib2-src := (source directory)
mylib2-obj := $(patsubst $(mylib2-src)/%.cpp, obj/LIB2/%.o, $(wildcard $(mylib2-src)/*.cpp))
default: all
lib/mylib1.a: $(mylib1-obj)
ar -r $@ $^
lib/mylib2.a: $(mylib2-obj)
ar -r $@ $^
all: exe/my_out
exe/my_out: $(my_out-obj)
g++ $^ $(COMMON_FLAGS) $(LIBS) $(MY_FLAGS)
Когда я запускаю make, я сталкиваюсь с ошибкой, которая не можетссылка на lib / mylib1.a, и она ломается.Круто, мне просто нужно убедиться, что цель .a строится.Наивно возиться с make-файлом примерно так:
lib/mylib1.a: $(mylib1-obj)
ar -r $@ $^
lib/mylib2.a: $(mylib2-obj)
ar -r $@ $^
default: all
Теперь он прекрасно компилирует mylib1.a, но не компилирует ни mylib2.a, ни 'all'.
Вот где я застрял,Если я сделаю следующее:
default: all
lib/mylib1.a: $(mylib1-obj)
ar -r $@ $^
lib/mylib2.a: $(mylib2-obj)
ar -r $@ $^
all: lib/mylib1.a exe/my_out
, то компилятор пожалуется на то, что lib / mylib1.a не является исполняемым файлом.Что это не так, здорово, но оставляет меня в странной ситуации.Я могу скомпилировать .a файлы по отдельности.Я могу связать их с исполняемым файлом.Я не могу сделать все эти вещи одновременно, только возиться с make-файлом, что несколько противоречит сути.
Мой вопрос: почему изменение порядка по умолчанию меняет то, что создается?Как я могу получить все файлы .a для сборки и связать их с основным исполняемым файлом, не связываясь вручную с make-файлом каждый раз?Я довольно плохо знаком с make-файлами в общем, и я не уверен, почему это происходит.
Спасибо!