【问题标题】:make objects in Makefile在 Makefile 中创建对象
【发布时间】:2015-06-09 13:38:38
【问题描述】:

我有以下 Makefile:

CXX       = g++
CXXFLAGS  = -Wall -g
SOURCES  := divisor.cpp multiplier.cpp
OBJECTS  := ${SOURCES:.cpp=.o}

%.o: %.cpp 
        $(CXX) -c $(CXXFLAGS) $< -o $@

%: %.o $(OBJECTS)
        $(CXX) $(CXXFLAGS) $@.o -o $@.out

$(OBJECTS): %.o: %.cpp
        $(CXX) -c $(CXXFLAGS) $< -o $@
clean:
        rm -f *.o

我想要这个make文件如下: 如果我将一个名为123.cpp 的源文件添加到工作目录,我希望它生成它的目标文件,然后链接$(SOURCES) 中指定的编译源,这意味着:

g++ -c -Wall -g 123.cpp
g++ multipler.o divisor.o 123.o -o 123

如果必须生成或更新multiplier.cppdivisor.cpp,我想做。

但我失败了,因为 divisor.omultiplier.o 不会自动生成

我怎样才能做到这一点?

编辑

澄清一下,工作目录中有两种类型的源代码文件:divisor.cppmultipler.cpp 是一种类型,而任何其他文件,例如,123.cpp 是另一种类型。从某种意义上说,divisor.cppmultiplier.cpp 是其他源文件的必要条件。

我想自动化编译先决条件的过程并在编译其他文件时链接它们

g++ -c multiplier.cpp
g++ -c divisor.cpp
g++ -c -Wall -g 123.cpp
g++ multipler.o divisor.o 123.o -o 123

【问题讨论】:

  • 首先,你没有规则依赖于$(SOURCES)。您需要与 $(OBJECTS) 类似的东西
  • 您没有根据$(OBJECTS)指定任何最终目标?
  • 目标$(OBJECTS) 是否隐含地符合$(SOURCES) 的规则?取决于$(OBJECTS) 的最终目标不是%:%.o $(OBJECTS) 吗?谢谢两位
  • 当你说“添加一个名为123.cpp的源文件”时,你的意思是将该文件放入工作目录,还是以某种方式将“123.cpp”添加到makefile?
  • 我的意思是“添加一个名为123.cpp的源文件”我会相应地编辑问题。感谢您的评论

标签: c++ makefile


【解决方案1】:

使用wildcard函数:

SOURCES := $(wildcard *.cpp)

然后,您可以删除“特殊”源文件:

SPECIAL_SOURCES := divisor.cpp multiplier.cpp
SOURCES := $(filter-out $(SPECIAL_SOURCES),$(SOURCES))

改变你的规则来构建你真正想要的东西:

$(SPECIAL_OBJECTS) := $(SPECIAL_SOURCES:.cpp=.o)
$(BINARIES) := $(patsubst .cpp,,$(SOURCES))

$(SPECIAL_OBJECTS) : %.o : %.cpp
    $(CXX) $(CXXFLAGS) -c -o $@ $^

$(BINARIES) : % : %.cpp $(SPECIAL_OBJECTS)
    $(CXX) $(CXXFLAGS) -o $@ $^

【讨论】:

  • 谢谢,我会尽快尝试 :)
猜你喜欢
  • 2015-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-19
相关资源
最近更新 更多