c++ - 使用 make 编译多个可执行文件

标签 c++ c++11 makefile

我希望下面的 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/

相关文章:

c - 如何调试make

c++ - 尝试构建 C++ 程序时收到错误消息 "Template with C linkage"

c++ - 构造控制台菜单类层次结构的最佳方法?

C++线程: shared memory not updated despite absence of race

c++ - C++ 中的映射错误

c++ - (boost::&& std::) 绑定(bind)仅在参数太少的 MSVC 上失败

linux - 只执行一次 Makefile 规则

c++ - get_time 未按预期运行

c++ - 为什么 b.isEm() 在不同的行打印不同的东西?

c++ - 在 QT Creator 中使用 makefile