Makefile编译当前目录和所有子目录中的所有.cpp文件

问题描述:

我熟悉如何创建基本的makefiles,但我试图从我的所有.cpp文件创建.dylib(如.dll)当前目录和所有子目录,我对我应该做的事情不知所措。这是我目前的makefile,它只为2个.cpp文件生成.dylib。我不知道如何在没有硬编码的情况下为所有.cpp文件执行此操作。我的makefile应该怎么看?Makefile编译当前目录和所有子目录中的所有.cpp文件

# Define a variable for classpath 
CLASS_PATH = ../bin 

# Define a virtual path for .class in the bin directory 
vpath %.class $(CLASS_PATH) 

all: libhpaprogram.dylib 

# [email protected] matches the target, $< matches the first dependancy 
libhpaprogram.dylib: 
    cc -v -c -stdlib=libstdc++ -fPIC -I/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/ HPAProgram.cpp -o libhpaprogram.o 
    cc -v -c -stdlib=libstdc++ -fPIC -I/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/ DCDTWrapper.cpp -o DCDTWrapper.o 
    libtool -dynamic -lSystem libhpaprogram.o DCDTWrapper.o -o libhpaprogram.dylib 

HPAProgram.h : HPAProgram.class 
    javah -classpath $(CLASS_PATH) $* 

clean: 
    rm HPAProgram.h libhpaprogram.o libhpaprogram.dylib 
+0

不要打平常规制定规则。每个产生'.o'的'.cpp'文件应该有一条编译规则。然后有一条规则用于链接所有依赖关系。研究先前存在的规则。 –

你必须首先选择是使用make wildcard patterns

第二个选择是使用一个跨平台的工具,像CMake,并让它产生Makefile文件给你。因此,你可以从[大部分]血淋淋的细节中解脱出来,比如精确的编译器和链接器标志等。CMake甚至支持MS Visual Studio项目的生成:)

我想出了如何编译所有东西。我做了一些关于makefile的研究,这里是我的最终生成文件:

SRC=DCDTsrc 
TGT=obj 
INCLUDES=-IDCDTsrc DCDTWrapper.h HPAProgram.h 
FLAGS=-stdlib=libstdc++ -fPIC -I/System/Library/Frameworks/JavaVM.framework/Versions/A/Headers/ -v 
SOURCES=$(wildcard $(SRC)/*.cpp) DCDTWrapper.cpp HPAProgram.cpp 
OBJS=$(addprefix $(TGT)/, $(notdir $(SOURCES:.cpp=.o))) 
CC=GCC 

# Define a variable for classpath 
CLASS_PATH = ../bin 

# Define a virtual path for .class in the bin directory 
vpath %.class $(CLASS_PATH) 

all: libhpaprogram.dylib 

$(TGT)/%.o: $(SRC)/%.cpp 
    $(CC) $(FLAGS) -c $< -o [email protected] 

$(TGT)/%.o: %.cpp 
    $(CC) $(FLAGS) -c $< -o [email protected] 

# [email protected] matches the target, $< matches the first dependancy 
libhpaprogram.dylib: $(OBJS) 
    libtool -dynamic -lSystem $(OBJS) libhpaprogram.dylib 



HPAProgram.h : HPAProgram.class 
    javah -classpath $(CLASS_PATH) $* 

clean: 
    rm -rf $(TGT) 
    mkdir $(TGT) 
    rm HPAProgram.h libhpaprogram.o libhpaprogram.dylib