2017-10-13 117 views
0

我一直在爲項目添加源代碼到包含的生成文件中。現在,它現在完美運行。但是,如果我去掉代碼所表示的兩條線,使吐出以下錯誤:製造文件中變量的大小是否有限制

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) 
+0

我想你錯了。大小有限制,但通常很大(64K或類似的東西),而且你遠遠不能達到這個目的...你可以使用'$(info ENGINE_OBJECTS = $(ENGINE_OBJECTS))'來確保這是而不是宣佈後的問題。我可能會尋找隱藏的字符,並嘗試在分配階段使用':='而不是'='。 – HardcoreHenry

回答

1

沒有限制到一個變量的大小在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

相關問題