我的Makefile正在尝试编译一个不存在/编造的文件名

我的Makefile正在尝试编译一个不存在/编造的文件名,makefile,Makefile,这是我的第一个Makefile,所以我剪切并粘贴了我在网上发现的垃圾。我的目录结构非常简单,没有为makefile考虑。它是: 计划/ 项目/控制 项目/节点GMT 项目/普通 项目/接口 我正在为控件编写一个Makefile,并希望它独立于内部控件。它需要包括从公共接口编译和包含。这是我的Makefile: CC = g++ CFLAGS = -Wall -c INCLUDES = -I/usr/local/include -I/SuperCool/Ion-1.0.0-snapshot-1

这是我的第一个Makefile,所以我剪切并粘贴了我在网上发现的垃圾。我的目录结构非常简单,没有为makefile考虑。它是: 计划/ 项目/控制 项目/节点GMT 项目/普通 项目/接口

我正在为控件编写一个Makefile,并希望它独立于内部控件。它需要包括从公共接口编译和包含。这是我的Makefile:

CC = g++

CFLAGS = -Wall -c

INCLUDES = -I/usr/local/include -I/SuperCool/Ion-1.0.0-snapshot-1/include -I/SuperCool/FastrakSDK-4.0.1-snapshot-1/include/Fastrak/Engine/Core/CoreIpc -I/Projects/Common -I/Projects/Interfaces -I/Projects/NodeMgmt -I/Projects/Controller 

LFLAGS = -L/usr/local/lib -L/SuperCool/FastrakSDK-4.0.1-snapshot-1/lib

LIBS = -lCoreIpc4 -lIonOs

VPATH = ../Interfaces/
VPATH = ../Common/
VPATH = ../NodeMgmt/

SRCS = *.cc

OBJS = $(SRCS:.cc=.o)

MAIN = controller

.PHONY: clean

all:    $(MAIN)
    @echo Built Controller

$(MAIN): $(OBJS)
    $(CC) $(CFLAGS) $(INCLUDES) -o $(MAIN) $(OBJS) $(LFLAGS) $(LIBS)

.cc.o:
    $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@

clean:
    $(RM) *.o $(MAIN)
CC=g++
CFLAGS=-Wall-c
INCLUDES=-I/usr/local/include-I/supercol/Ion-1.0.0-snapshot-1/include-I/supercol/FastrakSDK-4.0.1-snapshot-1/include/Fastrak/Engine/Core/CoreIpc-I/Projects/Common-I/Projects/Interfaces-I/Projects/NodeMgmt-I/Projects/Controller
LFLAGS=-L/usr/local/lib-L/supercol/FastrakSDK-4.0.1-snapshot-1/lib
LIBS=-lCoreIpc4-lIonOs
VPATH=../Interfaces/
VPATH=../Common/
VPATH=../NodeMgmt/
SRCS=*.cc
OBJS=$(SRCS:.cc=.o)
主控制器
.假冒:干净
全部:$(主)
@回声内置控制器
$(主):$(OBJS)
$(CC)$(CFLAGS)$(包括)-o$(主)$(OBJS)$(LFLAGS)$(LIBS)
.cc.o:
$(CC)$(CFLAGS)$(包括)-c$<-o$@
清洁:
$(RM)*.o$(主)
它正在编译它找到的第一个.cc文件“-c Controller.cc-o*.o”,这很有意义,但这就是它编译的全部内容,我得到的是一个*.o输出文件,而不是Controller.o文件。它不会编译任何其他文件。

这里有一个问题:

SRCS = *.cc
如果没有
通配符
函数,Make无法理解通配符:

SRCS = $(wildcard *.cc)

这应该能让它工作起来;我们以后可以做一些小的改进。

谢谢,这太棒了,它们都可以编译。现在Common/和Interfaces/中的文件没有被编译,所以当我尝试链接时,它会呕吐。我原以为所有的源代码都是从VPATH获取的?我刚刚将SRCS更新为SRCS=$(通配符../Common/*.cc../Interfaces/*.cc*.cc),这是一个我知道但仍然不会链接的黑客程序。我是否需要另一种方法,或者如何以同样的方式更新OBJS变量?@jnbender,您必须做出一些设计决策。假设您有
Common/foo.cc
接口/bar.cc
foo.o
是否应进入
Common/
bar.o
进入
Interfaces/
?或者两者都应该进入
控制/
?它们在逻辑上是分开的。接口是预处理文件,即协议缓冲区文件,公共文件在另外2个单独的客户机/和服务器/目录之间共享。我希望客户端和服务器能够独立使用2个公共共享C++类定义的协议缓冲区接口来独立构建。这就是目标。