我熟悉如何创建基本的makefile,但我正在尝试从当前目录和所有子目录中的所有.cpp文件创建.dylib(如.dll),我正在失去我应该做的事。这是我当前的makefile,只为2个.cpp文件生成.dylib。我不知道如何在没有硬编码的情况下为所有.cpp文件执行此操作。我的makefile应该怎么样?
# 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
# $@ 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 :(得分:2)
您拥有的第一个选项是使用make wildcard patterns
第二个选项是使用像CMake这样的跨平台工具,让它为您生成Makefile。因此,您将从[大多数]血腥细节中解脱出来,例如精确的编译器和链接器标记等.CMake甚至支持生成MS Visual Studio项目:)
答案 1 :(得分:0)
我想出了如何编译所有内容。我对makefile进行了一些研究,这是我的最终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 $@
$(TGT)/%.o: %.cpp
$(CC) $(FLAGS) -c $< -o $@
# $@ 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