0

我正在使用这个通用的 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

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

我正在使用带有 gcc 4.2.1 的 Mac OS X 10.6.8,并尝试使用main.cppSDL和 OpenGL 进行编译。SDLMain.mSDLMain.h

弹出的错误是:

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

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

-n ./
main.o: main.cpp

有什么问题?

4

2 回答 2

1

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

make -p 2>&1 | tee mkerr

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

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

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

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

于 2012-11-25T17:33:35.187 回答
0

我替换echo -nprintf它解决了问题:

# 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) $< >> $@ 
于 2012-11-25T17:57:35.920 回答