Как генерировать Make-файл с источником в подкаталогах, использующих всего один make-файл

Вы должны добавить еще одну метку из панели инструментов в форму. В таймере устанавливаются границы новой метки также так:

    int x = 25, y = 1;
    public Form1()
    {
        InitializeComponent();
    }


    private void timer1_Tick_1(object sender, EventArgs e)
    {
        label1.SetBounds(x, y, 255, 255);
        label2.SetBounds(x, 100, 255, 255);
        x++;
        if (x >= 800)
        {
            x = 1;
        }
    }

    private void Form1_Load_1(object sender, EventArgs e)
    {
        label1.Text = "hii";
        label1.Font = new Font(" ", 22, FontStyle.Bold);

        label2.Text = "hii2";
        label2.Font = new Font(" ", 22, FontStyle.Bold);

        timer1.Interval = 10;
        timer1.Start();
    }
56
задан Jeroen Dirks 23 October 2008 в 19:56
поделиться

4 ответа

Причина состоит в том что Ваше правило

%.o: %.cpp
       ...

ожидает, что .cpp файл будет находиться в том же каталоге как.o Ваше здание. Так как test.exe в Вашем случае зависит от build/widgets/apple.o (и т.д.), сделайте, ожидает, что apple.cpp будет build/widgets/apple.cpp.

Можно использовать VPATH для разрешения этого:

VPATH = src/widgets

BUILDDIR = build/widgets

$(BUILDDIR)/%.o: %.cpp
      ...

При попытке создать "build/widgets/apple.o", составьте поиск завещания apple.cpp в VPATH. Обратите внимание, что правило сборки должно использовать специальные переменные для доступа к фактическому имени файла, делают, находит:

$(BUILDDIR)/%.o: %.cpp
        $(CC) $< -o $@

Где "$ <" расширяется до пути, где делают расположенными первая зависимость.

Также обратите внимание, что это создаст все.o файлы в сборке/виджетах. Если Вы хотите создать двоичные файлы в различных каталогах, можно сделать что-то как

build/widgets/%.o: %.cpp
        ....

build/ui/%.o: %.cpp
        ....

build/tests/%.o: %.cpp
        ....

Я рекомендовал бы использовать "консервированные последовательности команды", чтобы не повторять фактическое правило сборки компилятора:

define cc-command
$(CC) $(CFLAGS) $< -o $@
endef

У Вас может затем быть несколько правил как это:

build1/foo.o build1/bar.o: %.o: %.cpp
    $(cc-command)

build2/frotz.o build2/fie.o: %.o: %.cpp
    $(cc-command)
70
ответ дан 26 November 2019 в 17:08
поделиться

Дело в том, что $ @ будет включать полный (относительный) путь к исходному файлу, который, в свою очередь, используется для создания имени объекта (и, следовательно, его относительного пути)

Мы используем:

#####################
# rules to build the object files
$(OBJDIR_1)/%.o: %.c
    @$(ECHO) "$< -> $@"
    @test -d $(OBJDIR_1) || mkdir -pm 775 $(OBJDIR_1)
    @test -d $(@D) || mkdir -pm 775 $(@D)
    @-$(RM) $@
    $(CC) $(CFLAGS) $(CFLAGS_1) $(ALL_FLAGS) $(ALL_DEFINES) $(ALL_INCLUDEDIRS:%=-I%) -c $< -o $@

Это создает каталог объектов с именем, указанным в $ (OBJDIR_1) и подкаталоги в соответствии с подкаталогами в источнике.

Например (предположим, что objs является каталогом объектов верхнего уровня), в Makefile:

widget/apple.cpp
tests/blend.cpp

приводит к следующему каталогу объектов:

objs/widget/apple.o
objs/tests/blend.o
4
ответ дан 26 November 2019 в 17:08
поделиться

Это сделает это без болезненных манипуляций или нескольких последовательностей команд:

build/%.o: src/%.cpp
src/%.o: src/%.cpp
%.o:
    $(CC) -c $< -o $@

build/test.exe: build/widgets/apple.o build/widgets/knob.o build/tests/blend.o src/ui/flash.o
    $(LD) $^ -o $@

JasperE объяснил, почему "% .o:% .cpp" не работает; в этой версии есть одно шаблонное правило (% .o :) с командами без предварительных требований и два шаблонных правила (build /%. o: и src /%. o :) с предварительными требованиями и без команд. (Обратите внимание, что я добавил правило src /%. O для работы с src / ui / flash.o, предполагая, что это не опечатка для build / ui / flash.o, поэтому, если оно вам не нужно, вы можете оставьте это.)

build / test.exe требует build / widgets / apple.o,
build / widgets / apple.o выглядит как build /%. o, поэтому ему нужен src /%. cpp (в данном случае src / widgets / apple.cpp),
build / widgets / apple.o также выглядит как% .o, поэтому он выполняет команду CC и использует только что найденные предварительные требования (а именно src / widgets / apple.cpp) для создания цели (build / widgets / apple.o)

3
ответ дан 26 November 2019 в 17:08
поделиться

Это помогает:

CC        := g++
LD        := g++

MODULES   := widgets test ui
SRC_DIR   := $(addprefix src/,$(MODULES))
BUILD_DIR := $(addprefix build/,$(MODULES))

SRC       := $(foreach sdir,$(SRC_DIR),$(wildcard $(sdir)/*.cpp))
OBJ       := $(patsubst src/%.cpp,build/%.o,$(SRC))
INCLUDES  := $(addprefix -I,$(SRC_DIR))

vpath %.cpp $(SRC_DIR)

define make-goal
$1/%.o: %.cpp
    $(CC) $(INCLUDES) -c $$< -o $$@
endef

.PHONY: all checkdirs clean

all: checkdirs build/test.exe

build/test.exe: $(OBJ)
    $(LD) $^ -o $@


checkdirs: $(BUILD_DIR)

$(BUILD_DIR):
    @mkdir -p $@

clean:
    @rm -rf $(BUILD_DIR)

$(foreach bdir,$(BUILD_DIR),$(eval $(call make-goal,$(bdir))))

Этот Makefile предполагает, что у вас есть включаемые файлы в исходные каталоги. Также он проверяет, существуют ли каталоги сборки, и создает их, если они не существуют.

Последняя строка самая важная. Он создает неявные правила для каждой сборки с помощью функции make-goal , и нет необходимости записывать их одно за другим

Вы также можете добавить автоматическое создание зависимостей, используя способ Троми

]
67
ответ дан 26 November 2019 в 17:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: