Makefile错误:缺少分隔符,使用SDL和OpenGL进行编译

时间:2012-11-25 17:20:53

标签: c++ opengl gcc makefile sdl

我正在使用this generic makefile

使用此自定义选项:

# The pre-processor options used by the cpp (man cpp for more).
CPPFLAGS  = -Wall -I/Library/Frameworks/SDL.framework/Headers

# The options used in linking as well as in any direct use of ld.
LDFLAGS   = -framework SDL -framework Cocoa -framework OpenGL

# The executable file name.
# If not specified, current directory name or `a.out' will be used.
PROGRAM   = app

# The source file types (headers excluded).
# .c indicates C source files, and others C++ ones.
SRCEXTS = .c .C .cc .cpp .CPP .c++ .cxx .cp .m

clean:
    $(RM) $(OBJS) $(PROGRAM) $(PROGRAM)

而不是:

# The pre-processor options used by the cpp (man cpp for more).
CPPFLAGS  = -Wall

# The options used in linking as well as in any direct use of ld.
LDFLAGS   = 

# The executable file name.
# If not specified, current directory name or `a.out' will be used.
PROGRAM   = 

# The source file types (headers excluded).
# .c indicates C source files, and others C++ ones.
SRCEXTS = .c .C .cc .cpp .CPP .c++ .cxx .cp

clean:
    $(RM) $(OBJS) $(PROGRAM) $(PROGRAM).exe

Here你可以找到我正在运行的makefile的完整版本。

我正在使用Mac OS X 10.6.8和gcc 4.2.1并尝试使用SDL和OpenGL编译main.cpp SDLMain.mSDLMain.h

弹出的错误是:

  

main.d:1: * 缺少分隔符。停止。

和文件main.d(由makefile生成)是这样的:

-n ./
main.o: main.cpp

有什么问题?

2 个答案:

答案 0 :(得分:1)

您展示的Makefile [exerpt]未显示main.d是如何创建的,但它似乎包含在实际的Makefile中。它可能意味着包含main.cpp-n ./' is clearly not valid make`语法的依赖关系。尝试暂时删除该文件,如果它重新生成,您需要找到它的生成方式并解决此问题。要查看它是如何生成的,请删除该文件并使用

make -p 2>&1 | tee mkerr

完成后,mkerr包含make命令的输出,包括它使用的规则。在某处有一条规则如何构建.d文件。运气好的话,删除文件可以解决问题......

根据发布到pastebin的代码,问题是如何创建%.d文件的规则:

%.d: %.cpp
    @echo -n $(dir $<) > $@
    @$(DEPEND.d) $< << $@

问题是找到的echo不理解-n选项,这意味着要避免任何换行。规则的第一行应该为文件添加目录前缀。 esieast修复程序是找到一个更好的echo,它可以理解-n选项。虽然,您可能需要使用不同的shell,因为echo往往是内置的shell!在这种情况下,您可能最好使用echo上的完整路径到不会出现行为异常的版本。

答案 1 :(得分:0)

我将echo -n替换为printf并解决了问题:

# Rules for creating dependency files (.d).
#------------------------------------------

%.d:%.c
    @printf $(dir $<) > $@
    @$(DEPEND.d) $< >> $@

%.d:%.C
    @printf $(dir $<) > $@
    @$(DEPEND.d) $< >> $@

%.d:%.cc
    @printf $(dir $<) > $@
    @$(DEPEND.d) $< >> $@

%.d:%.cpp
    @printf $(dir $<) > $@
    @$(DEPEND.d) $< >> $@

%.d:%.CPP
    @printf $(dir $<) > $@
    @$(DEPEND.d) $< >> $@

%.d:%.c++
    @printf $(dir $<) > $@
    @$(DEPEND.d) $< >> $@

%.d:%.cp
    @printf $(dir $<) > $@
    @$(DEPEND.d) $< >> $@

%.d:%.cxx
    @printf $(dir $<) > $@
    @$(DEPEND.d) $< >> $@

%.d:%.m
    @printf $(dir $<) > $@
    @$(DEPEND.d) $< >> $@