C++ Makefile项目赢得';不更改makefile后生成t(几乎相同的make,工作正常)
就在昨天,我在linux下编译了一个makefile项目。现在项目将不会编译,我不记得对makefile本身做了任何更改。它抛出了一个C++ Makefile项目赢得';不更改makefile后生成t(几乎相同的make,工作正常),c++,c,makefile,C++,C,Makefile,就在昨天,我在linux下编译了一个makefile项目。现在项目将不会编译,我不记得对makefile本身做了任何更改。它抛出了一个make:**没有规则将目标设置为“obj/tranquimain.o”,这是“tranquire;”所需要的;。停止。错误出现在make。我所做的唯一真正的更改是,当我从另一个项目复制代码和修改文件时,我更改了某些文件(包括依赖项)的名称,然后更改了修改文件中的\u DEPS。所有文件都在必要的位置 应该注意的是,如果我从_OBJ列表中删除除tranquimai
make:**没有规则将目标设置为“obj/tranquimain.o”,这是“tranquire;”所需要的;。停止。
错误出现在make
。我所做的唯一真正的更改是,当我从另一个项目复制代码和修改文件时,我更改了某些文件(包括依赖项)的名称,然后更改了修改文件中的\u DEPS
。所有文件都在必要的位置
应该注意的是,如果我从_OBJ列表中删除除tranquimain.o以外的所有其他文件,它的编译效果很好<代码>在这里输入代码我希望我能提供的不仅仅是代码和这些知识,但我不知道问题出在哪里
适当的Makefile:“Makefile”
#/usr/bin/make
CC=gcc
CP=g++
SRC_DIR=#。
OBJ_DIR=OBJ
INC_DIR=../include
LIB_DIR=../LIB
LIBS=-lm-lSDL-lSDLmain-lSDL_image-lSDL_mixer-lSDL_ttf-lSDL_net-lGL-lGLU-lGLEW
CFLAGS=-I$(INC_DIR)-L$(LIB_DIR)-std=gnu++0x
_DEPS=DefaultConfig.h BaseApplication.h BasePlugin.h SDLImage.h SDLFont.h SDLWindow.h SDLInput.h SDLRenderer.h SDLApplication.h Math2D.h SDLTimer.h
部门=$(patsubst%,$(INC\U DIR)/%,$(部门))
_OBJ=tranquimain.o BaseApplication.o BasePlugin.o SDLImage.o SDLFont.o SDLWindow.o SDLInput.o SDLRenderer.o SDLApplication.o Math2D.o SDLTimer.o
OBJ=$(patsubst%,$(OBJ\U DIR)/%,$(\U OBJ))
$(OBJ_DIR)/%.o:%.cpp$(DEPS)
$(CP)-c-o$@$<$(CFLAGS)
宁静:$(OBJ)
$(CP)-o../bin/$@$^$(CFLAGS)$(LIBS)
.假冒:干净
清洁:
rm-f$(OBJ\U DIR)/*.o*~core$(INC\U DIR)/*~
main.cpp(只是依赖项中的第一个文件)
#包括
#包括
#包括
int main(int argc,char*args[]
{
bool running=true;
while(running==true)
{
}
返回0;
}
当我从上面的Makefile和项目结构开始时
├── 包括/
└── src/
├── 生成文件
├── 特兰斯曼
└── obj/
然后我得到了与“宁静”所需的相同的make:**No-rule使目标为“obj/tranquimain.o”。
上面报告的错误。这是什么原因?让我们在调试模式下运行make来找出答案
第一加
。后缀:
%::SCCS/s.%
%::RCS/%
%::RCS/%,v
%:%,v
%::s.%
到Makefile的顶部,以取消一些只会使调试输出混乱的默认规则
然后,运行make-d
:
GNU Make 3.81
版权所有(C)2006免费软件基金会。
这是自由软件;有关复制条件,请参见源。
没有担保;甚至不是为了适销性或是否适合
特殊目的。
此程序为i386-apple-darwin11.3.0构建
正在读取生成文件。。。
正在读取makefile“makefile”。。。
正在更新生成文件。。。。
正在考虑目标文件“Makefile”。
正在查找“Makefile”的隐式规则。
未找到“Makefile”的隐式规则。
已完成目标文件“Makefile”的先决条件。
无需重新生成目标“Makefile”。
更新目标。。。。
正在考虑目标文件“宁静”。
“宁静”文件不存在。
正在考虑目标文件“obj/tranquimain.o”。
文件“obj/tranquimain.o”不存在。
正在查找'obj/tranquimain.o'的隐式规则。
正在尝试使用茎“typemain”的模式规则。
正在尝试隐式先决条件'trunquimain.cpp'。
正在尝试规则先决条件“../include/DefaultConfig.h”。
正在尝试使用茎“typemain”的模式规则。
正在尝试隐式先决条件'trunquimain.cpp'。
正在尝试规则先决条件“../include/DefaultConfig.h”。
正在查找中间文件为“../include/DefaultConfig.h”的规则。
避免隐式规则递归。
找不到'obj/tranquimain.o'的隐式规则。
已完成目标文件“obj/tranquimain.o”的先决条件。
必须重新制作目标'obj/tranquimain.o'。
make:**没有规则将目标'obj/tranquimain.o'设置为'tranquire'所需。停止
make
首先确保Makefile
是最新的。然后,它尝试通过执行深度优先搜索,构建所有必需的依赖项,使目标变得平静tranquire
依赖于${OBJ}
,其中的第一个元素是OBJ/tranquimain.o
。根据${OBJDIR}/%.o
规则,这取决于tranquimain.cpp
和所有${DEPS}
。${DEPS}
的第一个元素是./include/DefaultConfig.h
,因此make
尝试构建它。但它并不存在,也没有建立它的规则make
得出结论,它无法使用此规则生成obj/tranquimain.o
,因为缺少依赖项。它试图找到另一个规则来使用其他确实存在的依赖项构建它,但没有这样的规则。因此,make
停下来说,“没有[有效的]规则[存在依赖项或可以为其构建依赖项]来生成targetobj/tranquimain.o
”
解决办法是什么?确保所有依赖项都存在。使用此Makefile,要编译任何内容,您的项目必须至少包含:
。
├── 包括/
│ ├── BaseApplication.h
│ ├── BasePlugin.h
│ ├── DefaultConfig.h
│ ├── Math2D.h
│ ├── SDLApplication.h
│ ├── SDLFont.h
│ ├── SDLImage.h
│ ├── SDLInput.h
│ ├── SDLRenderer.h
│ ├── SDLTimer.h
│ └── SDLWindow.h
├── 解放党/
└── src/
├── BaseApplication.cpp
├── BasePlugin.cpp
├── 生成文件
├── Math2D.cpp
├── SDLApplication.cpp
├── SDLFont.cpp
├── SDLImage.cpp
├── SDLInput.cpp
├── 斯德伦德
#!/usr/bin/make
CC = gcc
CP = g++
SRC_DIR = #.
OBJ_DIR = obj
INC_DIR = ../include
LIB_DIR = ../lib
LIBS = -lm -lSDL -lSDLmain -lSDL_image -lSDL_mixer -lSDL_ttf -lSDL_net -lGL -lGLU -lGLEW
CFLAGS = -I$(INC_DIR) -L$(LIB_DIR) -std=gnu++0x
_DEPS = DefaultConfig.h BaseApplication.h BasePlugin.h SDLImage.h SDLFont.h SDLWindow.h SDLInput.h SDLRenderer.h SDLApplication.h Math2D.h SDLTimer.h
DEPS = $(patsubst %,$(INC_DIR)/%,$(_DEPS))
_OBJ = TranquilMain.o BaseApplication.o BasePlugin.o SDLImage.o SDLFont.o SDLWindow.o SDLInput.o SDLRenderer.o SDLApplication.o Math2D.o SDLTimer.o
OBJ = $(patsubst %,$(OBJ_DIR)/%,$(_OBJ))
$(OBJ_DIR)/%.o: %.cpp $(DEPS)
$(CP) -c -o $@ $< $(CFLAGS)
tranquil: $(OBJ)
$(CP) -o ../bin/$@ $^ $(CFLAGS) $(LIBS)
.PHONY: clean
clean:
rm -f $(OBJ_DIR)/*.o *~ core $(INC_DIR)/*~
#include <iostream>
#include <fstream>
#include <string>
int main( int argc, char* args[] )
{
bool running = true;
while( running == true )
{
}
return 0;
}
#BAD!
tranquil: $(OBJ)
<space><space>$(CP) -o ../bin/$@ $^ $(CFLAGS) $(LIBS)
#GOOD!
tranquil: $(OBJ)
<tab>$(CP) -o ../bin/$@ $^ $(CFLAGS) $(LIBS)