2017-10-13 12 views
0

プロジェクトに含まれているメイクファイルにソースを追加しています。今のところ、完璧に動作します。メイクファイルに変数のサイズに制限がありますか?

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

それだけで長さにその何かを始める遮断ていますので、私が想定しています。私はコードで示される2つの行のコメントを外した場合でも、作るには、次のエラーを出してくれる。これは、変数の長さのいくつかの制限がある場合、それの周りには何か方法はありますか?

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における変数のサイズに制限はありません。あなたのオペレーティングシステムは、呼び出すことができるコマンドラインのサイズに最大限を課します。そのため、変数が非常に大きく、レシピでそれらを使用しようとすると、オペレーティングシステムはそれを許可しませんが、それは何もしませんとにかくあなたがここで見ている問題ではなく、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) 

あなたが任意のソースファイルが変更された場合、オブジェクトファイルのALLを再構築しなければならないことを言っているここ$(ENGINE_SOURCES)を追加することによって。私はそれがあなたが望んでいると信じることができません(ファイルが変更された場合にすべてを再構築したい場合は、常にすべてを再構築するシェルスクリプトを書くことができ、まったく作成する必要はありません)。

だけでなく、makeがソースファイルを見つけたり作成したりできない場合は、このパターンルールは一致しません。makeは他のパターンルールが一致するかどうかを探し続けます。この場合、他には何もないので、ちょうど "ちょっと、私はファイルを構築する方法を知らない"と言うだけです(この場合、.../window.oファイル)。

また、デバッグ(make -d)を使用してmakeを実行すると、問題が発生します(ただし、出力は大量ですので、ファイルにリダイレクトして、エディタなどで調べる必要があるかもしれません検索とページの前後)。

このルールから$(ENGINE_SOURCES)を削除する必要があります。それで、makeは、より合理的なエラーで失敗し、.../instance_buffer.oをビルドできません。

関連する問題