我一直在阅读有关如何编写makefile以在Linux上构建应用程序的大量内容,但我对于显然实现相同目标的许多不同方法感到非常困惑。
到目前为止,我已经提出建立档案。
SHELL = /bin/sh
CXX = g++
DEBUG = -g
CXXFLAGS = -std=c++11 -Wall -pedantic #-Wextra
CPPFLAGS = -I. \
-I./include
SOURCES = foo1.cpp \
foo2.cpp \
foo3.cpp
OBJECTS = $(SOURCES:.cpp=.o)
以下规则成功将每个源文件编译为目标文件,然后创建存档:
libfoo.a: $(OBJECTS)
ar rvcs $@ $(OBJECTS)
%.o: src/%.cpp ./include/%.h
$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $<
这也是做同样的事情:
libfoo.a: $(OBJECTS)
ar rvcs $@ $(OBJECTS)
$(OBJECTS) : %.o:src/%.cpp
$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $<
然而,这失败了,因为没有规则可以制作目标&#39; foo1.o:%。h
libfoo.a: $(OBJECTS)
ar rvcs $@ $(OBJECTS)
$(OBJECTS) : %.o:src/%.cpp %.o:%.h
$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $<
有人可以解释为什么它不起作用,哪种方法最好?
第一个选项将头文件列为依赖项,但第二个选项不是。这是我第三种选择的动机。
如何使用选项2或3将标题列为依赖项?
TIA
答案 0 :(得分:0)
您在试用#2和试用#3中使用的功能是static pattern rules,语法如下:
<targets...> : <target-pattern> : <prerequisites...>
只能有两个冒号,而不是三个冒号。你应该把你的尝试#3写成:
$(OBJECTS) : %.o : src/%.cpp %.h
$(CXX) -c $(CPPFLAGS) $(CXXFLAGS) -o $@ $<
请注意一件重要的事情:如果您创建任何不具有关联的.cpp
文件的.h
文件,则此规则将失败。就这么说吧。