制造文件中变量的大小是否有限制
问题描述:
我一直在为项目添加源代码到包含的生成文件中。现在,它现在完美运行。但是,如果我去掉代码所表示的两条线,使吐出以下错误:制造文件中变量的大小是否有限制
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 [email protected] $< $(CXXFLAGS)
$(ENGINE_LIB): $(ENGINE_OBJECTS)
ar rvs [email protected] $(ENGINE_OBJECTS)
$(OUT_DIR)/%.glsl: $(ENGINE_SHADER_DIR)/%.glsl
cp -f $< [email protected]
$(APP_OBJECT_DIR)/%.o: $(APP_SOURCE_DIR)/%.cpp $(APP_SOURCES)
$(CXX) -I$(ENGINE_HEADER_DIR) -c -o [email protected] $< $(CXXFLAGS)
$(EXECUTABLE): $(APP_OBJECTS)
$(CXX) -o [email protected] $^ $(APP_CXX_LIBS) $(ENGINE_CXX_LIBS)
答
没有限制到一个变量的大小在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 [email protected] $< $(CXXFLAGS)
通过添加$(ENGINE_SOURCES)
在这里你是说,如果任何源文件更改,目标文件的所有必须重建。我无法相信这就是你想要的(如果你想在任何文件改变时重建所有东西,你只需编写一个shell脚本,它总是能够重建所有东西,而你根本不需要make)。
不仅如此,但如果化妆无法找到或建立ALL源文件,那么这个模式规则将不匹配,使得将继续寻找,看是否有些其他方式规则将匹配。在这种情况下,没有其他人,所以只是说“嘿,我不知道如何建立文件”(在这种情况下,.../window.o
文件)。如果你运行make调试(make -d
),你会看到问题(尽管输出很大,所以你可能需要将它重定向到一个文件,并用编辑器或更少的东西来检查,或者让你搜索和来回页面)。
您应该从此规则中删除$(ENGINE_SOURCES)
。那么很可能会失败并出现一个更合理的错误,它不能建立.../instance_buffer.o
。
我想你错了。大小有限制,但通常很大(64K或类似的东西),而且你远远不能达到这个目的...你可以使用'$(info ENGINE_OBJECTS = $(ENGINE_OBJECTS))'来确保这是而不是宣布后的问题。我可能会寻找隐藏的字符,并尝试在分配阶段使用':='而不是'='。 – HardcoreHenry