Makefile:动态源文件名和对象目录

时间:2018-10-10 14:51:41

标签: c++ makefile

我目前正在尝试使用sfml-framework来改善我的c ++项目的生成文件。我的项目的文件夹结构当前如下所示:

  • 头文件的源代码/头
  • .cpp文件的源代码/源
  • .exe的Bin /
  • lib / sfml库

我当前的Makefile:

CC  = g++ -g    

SRC = Src/Source/  

BIN = Bin/    

INC = -I Lib/SFML/include/ -I Src/Header/    

LIB = -L Lib/SFML/lib/ -lsfml-graphics-d -lsfml-window-d -lsfml-system-d

EXE = Test     

SOURCEFILES = $(SRC)Main.cpp $(SRC)Menu.cpp $(SRC)Button.cpp

OBJ = $(SOURCEFILES:.cpp=.o)

all: $(SOURCEFILES) $(EXE)

$(EXE) : $(OBJ)
    $(CC) -o $(BIN)$(EXE).exe $(OBJ) $(LIB)

.cpp.o:
    $(CC) -c $< $(INC) -o $@

此makefile可以正常工作,但是我有一些要改进的地方,但是无法正常工作。

  1. 当前需要手动将所有cpp文件添加到源文件列表中。由于该项目最有可能在文件数量方面快速增长,并且我有点想将源文件拆分到不同的子目录中,所以这很快就会变得一团糟。我试图用$(通配符Src / Source / *。cpp)将所有cpp文件保存在目录中,而不是单独列出它们,但是它甚至无法执行makefile。我在那儿想念什么?

  2. 使用我当前的makefile,所有.o文件都与.cpp文件放置在同一位置,这也是我真正不想要的东西。有没有办法将所有.o文件输出到一个额外的\ obj \目录中,然后从那里将其链接到.exe?

由于这是我第一次编写makefile,如果我的方法有一些一般性的改进,那么任何建议也应得到赞赏。

2 个答案:

答案 0 :(得分:1)

我很惊讶通配符对您不起作用,您可以共享任何错误代码?
通常我会这样写我的SRCS和OBJS变量:

SRCS = $(wildcard src/*.cpp) \
       $(wildcard test/*.cpp)
OBJS = $(patsubst %.cpp,$(BINDIR)/%.o,$(SRCS))

要将目标文件构建到另一个目录中,您可以编写如下内容:

$(BINDIR)/%.o: %.cpp
    $(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@

答案 1 :(得分:0)

  1. from keras.layers import Input, Dense, TimeDistributed from keras.models import Sequential, Model N = None # Use fixed value if you do not want variable input size K = 20 def small_model(): inputs = Input(shape=(K,)) # Define the small model # Here it is just a single dense layer outputs = Dense(K, activation='relu')(inputs) return Model(inputs=inputs, outputs=outputs) def large_model(): inputs = Input(shape=(N, K)) # Define the large model # Just a single neuron here outputs = Dense(1, activation='relu')(inputs) return Model(inputs=inputs, outputs=outputs) def combined_model(): inputs = Input(shape=(N, K)) # The TimeDistributed layer applies the given model # to every input across dimension 1 (N) small_model_out = TimeDistributed(small_model())(inputs) # Apply large model outputs = large_model()(small_model_out) return Model(inputs=inputs, outputs=outputs) model = combined_model() model.compile(loss='mean_squared_error', optimizer='sgd') model.summary() 应该可以工作:

    _________________________________________________________________
    Layer (type)                 Output Shape              Param #
    =================================================================
    input_1 (InputLayer)         (None, None, 20)          0
    _________________________________________________________________
    time_distributed_1 (TimeDist (None, None, 20)          420
    _________________________________________________________________
    model_2 (Model)              (None, None, 1)           21
    =================================================================
    Total params: 441
    Trainable params: 441
    Non-trainable params: 0
    _________________________________________________________________
    
  2. 但是,如果您计划将源文件放在wildcard的各个子目录中,它将不能很好地工作。多亏了SOURCEFILES = $(wildcard $(SRC)/*.cpp) make函数,使用Src/Source/实用程序。是的,您可以将所有目标文件存储在单独的目录中:

    find

请注意,我还修改了shell的定义,以使相应的规则是真实的文件到文件的生成规则,并使用了CC = g++ -g SRC = Src/Source/ OBJ = Obj/ BIN = Bin/ INC = -I Lib/SFML/include/ -I Src/Header/ LIB = -L Lib/SFML/lib/ -lsfml-graphics-d -lsfml-window-d -lsfml-system-d EXE = $(BIN)Test.exe SOURCEFILES = $(shell find $(SRC) -type f -name *.cpp) OBJECTFILES = $(patsubst $(SRC)%.cpp,$(OBJ)%.o,$(SOURCEFILES)) all: $(SOURCEFILES) $(EXE) $(EXE): $(OBJECTFILE) $(CC) -o $@ $^ $(LIB) $(OBJ)%.o: $(SRC)%.cpp mkdir -p $(dir $@) $(CC) -c $< $(INC) -o $@ EXE自动变量。