我希望下面的 makefile 能够编译多个可执行文件:
CXX = clang++
CXXFLAGS = -g -Wall --std=c++11
OBJS = two_rung.o three_rung.o dumbinterp.o interp.o writeLadderMPO.o
PROG = two_rung three_rung dumbinterp interp
SOURCES = two_rung.cc three_rung.cc dumbinterp.cc interp.cc writeLadderMPO.cc
HEADS = writeLadderMPO.h
INCLUDES = -I $(HOME)/ITensor
LIBS = -L $(HOME)/ITensor/lib -litensor -lstdc++ -framework Accelerate
all: $(PROG)
$(PROG): $(OBJS)
$(CXX) $(INCLUDES) -o $(PROG) $(OBJS) $(LIBS)
%.o: %.cc $(HEADS)
$(CXX) $(INCLUDES) -c -o $(OBJS) $(SOURCES)
可执行文件由 PROG
表示。当我尝试制作这些可执行文件之一时,例如 interp
,我得到的是
Computer:folder username$ make interp
clang++ -I /Users/username/ITensor -c -o two_rung.o three_rung.o dumbinterp.o interp.o writeLadderMPO.o two_rung.cc three_rung.cc dumbinterp.cc interp.cc writeLadderMPO.cc
也就是说,当我将它们作为变量调用时,Make 只是将所有文件扔进去,这完全有道理。但我希望它表现得像:
clang++ -I /Users/username/ITensor -c -o interp.o interp.cc
然后
clang++ -I /Users/username/ITensor -o interp interp.o -L $(HOME)/ITensor/lib -litensor -lstdc++ -framework Accelerate
如何让 Make 执行此操作?谢谢!
最佳答案
扩展我的评论。
考虑规则
$(PROG): $(OBJS)
$(CXX) $(INCLUDES) -o $(PROG) $(OBJS) $(LIBS)
这会被make
扩展成
two_rung three_rung dumbinterp interp: two_rung.o three_rung.o dumbinterp.o interp.o writeLadderMPO.o
clang++ -I $(HOME)/ITensor -o two_rung three_rung dumbinterp interp two_rung.o three_rung.o dumbinterp.o interp.o writeLadderMPO.o -L $(HOME)/ITensor/lib -litensor -lstdc++ -framework Accelerate
我想这与您的想法不太一样。
相反,您需要明确指定每个可执行目标和依赖项:
two_rung: two_rung.o writeLadderMPO.o
three_rung: three_rung.o writeLadderMPO.o
dumbinterp: dumbinterp.o writeLadderMPO.o
interp: interp.o writeLadderMPO.o
正确设置标志变量后,make
将正确链接它们。
关于将源文件编译成目标文件,你也有问题,在哪里
%.o: %.cc $(HEADS)
$(CXX) $(INCLUDES) -c -o $(OBJS) $(SOURCES)
将扩展为
%.o: %.cc writeLadderMPO.h
clang++ -I $(HOME)/ITensor -c -o two_rung.o three_rung.o dumbinterp.o interp.o writeLadderMPO.o two_rung.cc three_rung.cc dumbinterp.cc interp.cc writeLadderMPO.cc
实际情况并非如此,您需要分别从每个源文件创建每个目标文件。幸运的是,您仍然可以使用相同的基本规则,但不需要提供创建目标文件的命令:
%.o: %.cc $(HEADS)
差不多就这样了,不需要命令。但是,您还需要做例如
CXXFLAGS += $(INCLUDES)
在此规则之前。
关于c++ - 使用 make 编译多个可执行文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45318383/