Вы должны добавить еще одну метку из панели инструментов в форму. В таймере устанавливаются границы новой метки также так:
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();
}
Причина состоит в том что Ваше правило
%.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)
Дело в том, что $ @
будет включать полный (относительный) путь к исходному файлу, который, в свою очередь, используется для создания имени объекта (и, следовательно, его относительного пути)
Мы используем:
#####################
# 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
Это сделает это без болезненных манипуляций или нескольких последовательностей команд:
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)
Это помогает:
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
, и нет необходимости записывать их одно за другим
Вы также можете добавить автоматическое создание зависимостей, используя способ Троми
]