生成文件中变量的大小有限制吗



我一直在为一个项目向包含的makefile添加源代码。照原样,现在它运行得很完美。但是,如果我取消注释代码中指示的两行,make会显示以下错误:

make: *** No rule to make target 'engine/obj/graphics/window.o', needed by 'lib/engine.a'.  Stop.

我想,既然它只是切断了起点,它的长度就有问题了。如果这是变量长度的某种限制,有什么办法可以绕过它吗?

CXX = g++
CXXFLAGS = -std=c++11 -g -Wall -Wextra
OUT_DIR=out
LIB_OUT_DIR=lib
APP_NAME=main
ENGINE_NAME=engine.a
EXECUTABLE=$(OUT_DIR)/$(APP_NAME)
ENGINE_LIB=$(LIB_OUT_DIR)/$(ENGINE_NAME)
ENGINE_OBJECT_DIR=engine/obj
ENGINE_HEADER_DIR=engine/include
ENGINE_SOURCE_DIR=engine/src
ENGINE_SHADER_DIR=engine/shaders
APP_OBJECT_DIR=app/obj
APP_SOURCE_DIR=app/src
ENGINE_OBJECTS  = $(ENGINE_OBJECT_DIR)/graphics/window.o
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/graphics/shader_program.o
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/graphics/array.o
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/graphics/attribute_definition.o
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/graphics/abstract/buffer.o
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/graphics/simple_buffer.o
# ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/graphics/instance_buffer.o
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/graphics/index_buffer.o
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/math/vec2.o
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/math/vec3.o
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/math/vec4.o
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/math/mat4.o
ENGINE_OBJECTS += $(ENGINE_OBJECT_DIR)/util/logging.o
ENGINE_SOURCES  = $(ENGINE_SOURCE_DIR)/graphics/window.cpp
ENGINE_SOURCES +=   $(ENGINE_SOURCE_DIR)/graphics/shader_program.cpp
ENGINE_SOURCES +=   $(ENGINE_SOURCE_DIR)/graphics/array.cpp
ENGINE_SOURCES +=   $(ENGINE_SOURCE_DIR)/graphics/attribute_definition.cpp
ENGINE_SOURCES +=   $(ENGINE_SOURCE_DIR)/graphics/abstract/buffer.cpp
ENGINE_SOURCES +=   $(ENGINE_SOURCE_DIR)/graphics/simple_buffer.cpp
# ENGINE_SOURCES += $(ENGINE_SOURCE_DIR)/graphics/instance_buffer.cpp
ENGINE_SOURCES +=   $(ENGINE_SOURCE_DIR)/graphics/index_buffer.cpp
ENGINE_SOURCES +=   $(ENGINE_SOURCE_DIR)/math/vec2.cpp
ENGINE_SOURCES +=   $(ENGINE_SOURCE_DIR)/math/vec3.cpp
ENGINE_SOURCES +=   $(ENGINE_SOURCE_DIR)/math/vec4.cpp
ENGINE_SOURCES +=   $(ENGINE_SOURCE_DIR)/math/mat4.cpp
ENGINE_SOURCES +=   $(ENGINE_SOURCE_DIR)/util/logging.cpp
ENGINE_SHADERS = 
$(OUT_DIR)/vertexshader.glsl 
$(OUT_DIR)/fragmentshader.glsl
APP_OBJECTS = 
$(APP_OBJECT_DIR)/main.o
APP_SOURCES = 
$(APP_SOURCE_DIR)/main.cpp
ENGINE_CXX_LIBS=-Wl,-Bstatic -lGLEW -lglfw3 -pthread -Wl,-Bdynamic -lGL -lGLU -ldl -lX11 -lXi -lXxf86vm -lXrandr -lXcursor -lXinerama
APP_CXX_LIBS=-L$(LIB_OUT_DIR) -l:$(ENGINE_NAME)
.PHONY: all build clean engine app run
all: clean build run
clean:
rm -f $(OUT_DIR)/* $(LIB_OUT_DIR)/* $(ENGINE_OBJECTS) $(APP_OBJECTS)
build: engine app
run:
cd $(OUT_DIR) && 
./$(APP_NAME)
engine: $(ENGINE_LIB) $(ENGINE_SHADERS)
app: $(EXECUTABLE)
$(ENGINE_OBJECT_DIR)/%.o: $(ENGINE_SOURCE_DIR)/%.cpp $(ENGINE_SOURCES)
$(CXX) -I$(ENGINE_HEADER_DIR)  -c -o $@ $< $(CXXFLAGS)
$(ENGINE_LIB): $(ENGINE_OBJECTS)
ar rvs $@ $(ENGINE_OBJECTS)
$(OUT_DIR)/%.glsl: $(ENGINE_SHADER_DIR)/%.glsl
cp -f $< $@
$(APP_OBJECT_DIR)/%.o: $(APP_SOURCE_DIR)/%.cpp $(APP_SOURCES)
$(CXX) -I$(ENGINE_HEADER_DIR) -c -o $@ $< $(CXXFLAGS)
$(EXECUTABLE): $(APP_OBJECTS)
$(CXX) -o $@ $^ $(APP_CXX_LIBS) $(ENGINE_CXX_LIBS)

make中的变量大小没有限制(系统中的内存量除外)。你的操作系统会对make可以调用的命令行的大小施加最大值,所以如果你的变量很大,并且你试图在配方中使用它们,操作系统可能不允许,但这与make无关,也不是你在这里看到的问题。

我认为问题在于文件$(ENGINE_SOURCE_DIR)/graphics/instance_buffer.cpp不存在或者由于某种原因无法访问。

这个规则被打破了:

$(ENGINE_OBJECT_DIR)/%.o: $(ENGINE_SOURCE_DIR)/%.cpp $(ENGINE_SOURCES)
$(CXX) -I$(ENGINE_HEADER_DIR)  -c -o $@ $< $(CXXFLAGS)

通过在此处添加$(ENGINE_SOURCES),您的意思是,如果任何源文件发生更改,则必须重新生成ALL的对象文件。我不敢相信这就是你想要的(如果你想重建一切,如果任何文件发生了变化,你可以写一个shell脚本,它总是重建一切,你根本不需要make)。

不仅如此,如果make找不到或构建ALL源文件,那么这个模式规则将不匹配,make将继续寻找其他模式规则是否匹配。在这种情况下,没有其他文件,所以make只说"嘿,我不知道如何构建文件"(在这种情况中,是.../window.o文件)。

此外,如果您运行make with debugging(make -d),您会看到问题(尽管输出量很大,因此您可能需要将其重定向到一个文件,并使用编辑器或更少的编辑器或允许您来回搜索和分页的东西进行检查)。

您应该从此规则中删除$(ENGINE_SOURCES)。然后make可能会失败,并出现一个更合理的错误,即它无法构建.../instance_buffer.o

最新更新