【问题标题】:Makefile error: missing separator, compiling with SDL and OpenGLMakefile 错误:缺少分隔符,使用 SDL 和 OpenGL 编译
【发布时间】:2012-11-25 17:20:52
【问题描述】:

我正在使用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的完整版本。

我正在使用带有 gcc 4.2.1 的 Mac OS X 10.6.8,并尝试使用 SDL 和 OpenGL 编译带有 SDLMain.mSDLMain.hmain.cpp

弹出的错误是:

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

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

-n ./
main.o: main.cpp

有什么问题?

【问题讨论】:

  • 你在这里展示整个文件吗?因为我没有看到include 行,但它在抱怨单独文件的内容(main.d)。 // 读取错误信息:这就是你所做的。
  • @dmckee This 是该文件的完整粘贴。 (请注意我的问题的第一行)。
  • "(请注意我的问题的第一行)" 我不会在场外阅读代码:您的问题应该独立存在。如果需要几次点击才能看到它,我尤其不会在网站外阅读代码。您对现有的依赖文件(.ds)有疑问。清除它们,看看它是否再次出现。
  • @dmckee,它再次出现。尝试删除所有.d 文件并运行make,它仍然会再次创建它们。 The link我把你发在评论里一键就可以了,你能看一下吗?

标签: c++ opengl gcc makefile sdl


【解决方案1】:

您展示的 Makefile [exerpt] 没有显示 main.d 是如何创建的,但它似乎包含在实际的 Makefile 中。它可能意味着包含 main.cpp 的依赖关系,但 -n ./' is clearly not validmake` 语法。现在尝试删除文件,如果它被重新生成,您需要找到它是如何生成的并修复它。要再次查看它是如何生成的,请删除该文件并使用

make -p 2>&1 | tee mkerr

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

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

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

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

【讨论】:

  • 我已经尝试删除.d 文件并再次运行make,它仍然会再次创建它。完整文件请看here
  • @Jeffrey:您是否使用-p 选项运行以查看完整的规则集?
  • 我刚刚尝试运行make -p,它会打印生成文件。 -n ./ 有什么用? -n 标志是什么意思? (我triedtried 谷歌搜索)
  • @Jeffrey:-n 旨在抑制 echo 输出末尾的换行符。但是,使用了一些 echo,它不能正确理解 -n 选项并打印它,然后是其他参数和换行符。
【解决方案2】:

我将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) $< >> $@ 

【讨论】:

  • 这些行实际上是有道理的!没有它们的依赖项将无法正确处理子目录中的文件。问题是使用过的echo(可能是make 在您的设置中使用的shell 内置的那个):它不理解-n 选项,它应该在echo 的末尾抑制换行符输出。
  • 是的,我想是的。显然,您不会使用 -n 选项,而是从格式中省略任何换行符。但是,我不认为 printf 是标准的 POSIX shell 命令,这可能是使用 echo 的原因(尽管我不确定 -n 选项是否是标准的;我认为不是) .
  • @DietmarKühl,@DietmarKühl,OS X Manual page 表示“强烈建议旨在实现最大可移植性的应用程序使用 printf(1) 来抑制换行符。”。谢谢你的帮助。
猜你喜欢
  • 1970-01-01
  • 2016-10-04
  • 2012-05-13
  • 2022-01-05
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
  • 2019-05-07
  • 2012-03-23
相关资源
最近更新 更多