Короче говоря, $^
не то, что вы хотите здесь. Он оценивает «имена всех предпосылок с пробелами между ними». В задаче Makefile, которая заставляет все три цели использовать почти идентичные командные строки, каждая из которых выглядит как
g++ Tools.cpp Code1.cpp Code2.cpp Code3.cpp Tools.hh makefile -o Code1
Из приведенного сообщения об ошибке g ++ решил, что make-файл должен передаваться компоновщику, как если бы это был объект. Это не так. Без make-файла на линии вы все равно будете компилировать и связывать все четыре ваших исходных файла и, вполне вероятно, оставите компоновщик, чтобы решить, какую из четырех main()
функций использовать.
Вы, вероятно, хотите использовать тот факт, что make имеет огромное количество встроенных правил для общих случаев. Компиляция двух исходных файлов и связывание результатов отлично вписываются в эти распространенные случаи. Это не проверено, но следующее должно делать все, что вы хотите (при условии, по крайней мере, недавней сборки gnu make), и иметь преимущество, заключающееся в компиляции каждого объекта только один раз.
all: Code1 Code2 Code3
Code1: Code1.o Tools.o
Code2: Code2.o Tools.o
Code3: Code3.o Tools.o
Code1.o Code2.o Code3.o Tools.o: Tools.hh
Если вам нужно было установить некоторые параметры компилятора, вы можете добавить определение для CXXFLAGS, традиционно в верхней части файла.