Многие пакеты в наши дни поставляются с утилитой конфигурации, которая помогает установить требования компилятора.При необходимости я могу привести более конкретные примеры, но Makefile, который ссылается на две библиотеки, может иметь что-то вроде:
CPPFLAGS += $(shell PackageA-config --cflags)
CPPFLAGS += $(shell PackageB-config --cflags)
%.o : %.cc
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< -o $@
Теперь давайте предположим, что PackageA требует как минимум c ++ 11, а PackageB требует c ++17, то есть PackageA-config --cflags
даст -std=c++11
, а PackageB-config --cflags
даст -std=c++17
.gcc будет использовать тот флаг, который пришел последним, и, поскольку все стандарты обратно совместимы, это нормально и модно.
Но что, если я напишу свой Makefile в «неправильном» порядке, так что PackageB будет первым?Теперь флаг PackageA -std=c++11
действительно используется, и компиляция не удалась.
Есть ли способ сказать gcc, чтобы он взял самый высокий из указанных флагов, а не просто использовал последний?Если нет, есть ли стандартный способ справиться с этой головной болью?Если все остальное не сработает, может ли какой-нибудь гуру придумать исправление, манипулируя переменной Makefile?