2015-04-04 79 views
1

并感谢您的时间。我有下面的Makefile:在Makefile中创建对象

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

%.o: %.cpp 
     $(CXX) -c $(CXXFLAGS) $< -o [email protected] 

%: %.o $(OBJECTS) 
     $(CXX) $(CXXFLAGS) [email protected] -o [email protected] 

$(OBJECTS): %.o: %.cpp 
     $(CXX) -c $(CXXFLAGS) $< -o [email protected] 
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 
+1

首先,你有没有规则取决于''(SOURCES)''的地方。你需要类似于你用$'(OBJECTS)''' – BitTickler 2015-04-04 17:53:19

+1

做的事情。你没有根据'$(OBJECTS)'指定任何最终目标? – 2015-04-04 17:56:25

+0

目标'$(OBJECTS)'不会隐式地作为'$(SOURCES)'的规则吗? 取决于'$(OBJECTS)'的最终目标不是'%:%。$ $(OBJECTS)'? 谢谢 – Jorge 2015-04-04 17:59:37

回答

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 [email protected] $^ 

$(BINARIES) : % : %.cpp $(SPECIAL_OBJECTS) 
    $(CXX) $(CXXFLAGS) -o [email protected] $^ 
+0

谢谢,请参阅编辑。 – Jorge 2015-04-05 11:20:22

+0

@Jorge - 编辑来解决你想要的行为。 – 2015-04-05 14:34:33

+0

谢谢,我尽快尝试一下:) – Jorge 2015-04-06 10:53:18