无法生成Makefile可执行文件

时间:2018-11-22 23:05:51

标签: makefile g++

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无法运行?怎么了?

1 个答案:

答案 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