gpt4 book ai didi

c++ - 在 Makefile 中创建对象

转载 作者:行者123 更新时间:2023-11-30 05:45:17 26 4
gpt4 key购买 nike

我有以下 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,我想让 make 来做。

但我失败了,因为 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 := $(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 $@ $^

关于c++ - 在 Makefile 中创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29449551/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com