CC=g++
CFLAGS=-c -o
PROG=craps
LIBSRCS=craps.cpp craps_game.cpp craps_helper.cpp craps_io.cpp
LIBOBJS=$(patsubst %.cpp, %.o, $(LIBSRCS))
LIBCRAPS=craps
CXXFLAGS=-I./ -fpic
LDFLAGS=-L./
all: $(PROG)
$(PROG): $(LIBSRCS)
$(CC) $(LDFLAGS) -l$(PROG) -o $(PROG) $(PROG).o
$(LIBCRAPS): $(LIBOBJS)
$(CC) -shared -o lib$(LIBCRAPS).so $(LIBOBJS)
%.o: %.cpp
$(CC) $(CXXFLAGS) -c -o $@ $
depend:
${CC} -MM ${PROG}.cpp ${LIBSCRS} > depends.mak
include depends.mak
为什么不编译和生成可执行文件?
生成的所有o个文件都没有错误。
为什么此行$(CC) $(LDFLAGS) -l$(PROG) -o $(PROG) $(PROG).o
无法运行?怎么了?
答案 0 :(得分:0)
您误解了我的评论。我是这样说的:
PROG=craps LIBSRCS=craps.cpp craps_game.cpp craps_helper.cpp craps_io.cpp
是错误的。您不能在makefile中的同一行上分配两个变量。这些变量必须如下所示:
PROG=craps
LIBSRCS=craps.cpp craps_game.cpp craps_helper.cpp craps_io.cpp
我要问的是,后者是您的实际makefile的外观,还是您在此处提供的示例不准确。
此外,这些规则都有不正确的换行符:
$(PROG):
$(LIBSRCS) $(CC) $(LDFLAGS) -l$(PROG) -o $(PROG) $(PROG).o
$(LIBCRAPS):
$(LIBOBJS) $(CC) -shared -o lib$(LIBCRAPS).so $(LIBOBJS)
您正在将先决条件列表$(LIBSRCS)
和$(LIBOBJS)
添加到用于构建目标的配方(shell命令)中。前提条件必须与目标在同一行。这些应该看起来像这样:
$(PROG): $(LIBSRCS)
$(CC) $(LDFLAGS) -l$(PROG) -o $(PROG) $(PROG).o
$(LIBCRAPS): $(LIBOBJS)
$(CC) -shared -o lib$(LIBCRAPS).so $(LIBOBJS)
这是您的问题,下面
最后,您不能使程序和目标具有相同的名称:
PROG=craps
LIBCRAPS=craps
您只能使用给定名称创建一个目标,因此这两个变量的值不能为craps
。也许你想要:
PROG = craps
LIBCRAPS = libcraps.so
假设您在此处引用的makefile与您正在运行的makefile相同,那么在运行此makefile时,您必须从make
得到这样的警告:
Makefile:15: warning: overriding recipe for target 'craps'
Makefile:12: warning: ignoring old recipe for target 'craps'
这些警告是为什么您看不到编译规则被调用的原因:库规则正按照警告中的说明覆盖它。
此外,您还应该使程序依赖于库(因为它链接了该程序)和目标文件$(PROG).o
,因为当前make并不知道需要构建它。而且您不必依赖于所有源文件。您想要类似的东西:
$(PROG): $(LIBCRAPS) $(PROG).o
$(CC) $(LDFLAGS) -l$(PROG) -o $(PROG) $(PROG).o