Мой ответ (изящное решение): добавьте
LDLIBS = -lstdc++
в Makefile.Согласно руководство :
Библиотеки (-lfoo
) должны быть добавлены вместо переменной LDLIBS
.
LDFLAGS
Предназначен для флагов каталогов библиотек, таких как -L
.В моем Linux (Ubuntu 14.04) LDFLAGS = -lstdc++
производит
cc -lstdc++ main.o -o main
, который не работает, в то время как LDLIBS = -lstdc++
производит
cc main.o -lstdc++ -o main
, который работает.Я понятия не имею, почему порядок имеет значение, но он имеет смысл в соответствии с ролями двух встроенных переменных.Мне не нравится псевдоним CC
к CXX
, который выглядит как взлом, а также сбивает с толку читателей.
LDFLAGS vs LDLIBS
Я только что попробовал и обнаружил, что этот компилятор неработает для LDFLAGS = -lstdc++
:
, но следующие компиляторы принимают LDFLAGS = -lstdc++
:
- Clang3.4 в Ubuntu 14.04
- GCC 4.7.2 в Debian Wheezy
- Clang 7.3.0 (703.0.31) в OS X
Так что он работает большую частьвремя, но не гарантировано.Если вы хотите, чтобы ваш make-файл был более переносимым, используйте LDLIBS
, который работает во всех вышеперечисленных средах.
Почему нет других решений выше?
Hasturkun: иметь main.o
в правиле
main: main.o implementation.o
не приводит к ошибке.main.o
не является необходимым, но он все равно будет иметь значение.
Саймон Рихтер: решение устраняет необходимость отслеживать заголовок (что действительно здорово), но OP хочет неявноеправить.На самом деле мы можем получить лучшее из обоих:
VPATH = src include
CPPFLAGS = -I include -MMD -MP
CXXFLAGS = -g -W -Wall -Werror
LDLIBS = -lstdc++
target = main
lib = implementation.cpp
objects = $(target:=.o) $(lib:.cpp=.o)
$(target): $(objects)
%.o: %.cpp %.d
%.d: ;
-include $(objects:.o=.d)
clean::
$(RM) $(target) $(objects) $(objects:.o=.d)
, что делает то, что он сделал, а также воспользоваться неявными правилами.Тем не менее, это полное решение не должно быть здесь, так как это не то, что хочет OP: OP просто хочет знать, почему его Makefile не работает и почему.«Auto-Dependency Generation» - это еще одна огромная тема, заслуживающая всего учебника (например, , этот ).Так что извините, но его ответ на самом деле не ответил на вопрос.
Джером: Раньше я менял LINK.o
с $(CC) $(LDFLAGS) $(TARGET_ARCH)
на $(CXX) $(LDFLAGS) $(TARGET_ARCH)
, и это работало, ноЯ предпочитаю редактировать LDLIBS
, так как LINK.o
не документирован (и, возможно, не является частью общедоступного API) и не предназначен для будущего.Я бы назвал это хаком.