如何编写makefile来生成目标文件和可执行文件在不同的目录中?

现在继续我需要更改现有Makefile的表示。

目前我正在使用:

~/Linuz/src: 1.c, 2.c, 3.c ... ~/Linuz/inc: abc.h, xyz.h 

和makefile在: ~/Linuz/some_other_dir/

但需要改变结构。

  1. 想要从( ~/Linuz/src/~/linuz/inc )创建一个库
  2. 库将用于获取可执行文件。 应用程序源文件(.c文件)位于~/Linuz/app/
  3. ~/Linuz/bin/应该在编译期间创建,以存储所有目标文件和可执行文件。

有什么建议 ??

我的makefile看起来像这样:

 all: Library.a %.o: ../src/%.c $(CC) $(CFLAGS) -I../inc/ -c -o $@ $^ Library.a: $(SRC_DIR)/1.c $(SRC_DIR)/2.c $(SRC_DIR)/3.c $(SRC_DIR)/4.c $(SRC_DIR)/5.c $(CC) $(LDFLAGS) -o $@ $^ all: prog %.o: ./*.c $(CC) $(CFLAGS) -ILibrary.a -c -o $@ $^ prog: $(APP_DIR)/app1.c $(APP_DIR)/app2.c $(APP_DIR)/app3.c clean: rm -f *.o my_program 

假设您的代码体系结构如下所示:

 └── linuz ├── app │  ├── app1.c │  ├── app2.c │  └── app3.c ├── bin ├── inc │  └── any.h ├── some_other_dir │  └── Makefile └── src ├── 1.c ├── 2.c └── 3.c 

所以你的Makefile可能是:

 all: ../bin/libmy_lib.a ../bin/my_program ../bin/my_lib_%.o: ../src/%.c $(CC) $(CFLAGS) -I../inc -c -o $@ $^ ../bin/libmy_lib.a: ../bin/my_lib_1.o ../bin/my_lib_2.o ../bin/my_lib_3.o ar rcs $@ $^ ../bin/my_app_%.o: ../app/%.c $(CC) $(CFLAGS) -I../inc -c -o $@ $^ ../bin/my_program: ../bin/my_app_app1.o ../bin/my_app_app2.o ../bin/my_app_app3.o ../bin/libmy_lib.a $(CC) $(LDFLAGS) -L../bin/ -lmy_lib -o $@ $^ clean: rm -f ../bin/*.o ../bin/libmy_lib.a ../bin/my_program 

有关说明,请参阅上一个问题