C++ 来自不同目录的多个二进制文件和库的Makefile
有一个项目布局:C++ 来自不同目录的多个二进制文件和库的Makefile,c++,c,makefile,gnu-make,C++,C,Makefile,Gnu Make,有一个项目布局: . ├── bin # <= executables go here ├── build # <= object files created here ├── lib # <= libraries go here ├── Makefile ├── src │ ├── bin1 # <= if there is no "lib" prefix │ ├── bin2 # <= it must be considered as
.
├── bin # <= executables go here
├── build # <= object files created here
├── lib # <= libraries go here
├── Makefile
├── src
│ ├── bin1 # <= if there is no "lib" prefix
│ ├── bin2 # <= it must be considered as executable
│ │ ├── a.c
│ │ ├── b.c
│ │ └── foo.h
│ ├── include # <= shared .h files, nothing to build here
│ ├── libt1 # <= if there is "lib" prefix - it must be
│ │ ├── blah.c # a library
│ │ └── blah.h
│ └── libt2
└── test
但我不知道如何执行所有其他步骤,我应该如何迭代所有dir?假设,如果我“用手”来做,它将看起来像:
lib/libt1.a:
$(CC) -o build/libt1.o $(CFLAGS) -c $(wildcard $(SOURCES_DIR)/libt1/*.c)
ar rcs lib/libt1.a build/libt1.o
你知道哪几件?你能写一个规则来构建
bin/bin2
?怎么样lib/libt1.a
?@Beta,是的,我知道如何逐个构建它,请参阅编辑的问题。向我们展示您当前的make文件。我们非常愿意调试一些现有代码,但非常不愿意为您完成工作。因此,您希望“make”在“src/”目录上执行“glob”,对于找到的每个项目,如果前3个字符为“bin”,则执行编译/链接,编译输出移动到“build”目录,可执行文件移动到“bin”目录如果前3个字符为“lib”,则执行编译/链接,编译输出移动到“build”目录,生成的库移动到“lib”目录。始终在搜索当前目录和“include”目录中的头文件。“src”下可以有任意数量的子目录。要查找子字符串:$(findstring find,in)
在中搜索中出现的find
。如果发生,则该值为find;否则,该值为空。您可以在条件中使用此函数来测试给定字符串中是否存在特定子字符串。然后使用:#ifneq$(findstring find,in)“
输入下一行(如果找到子字符串)
lib/libt1.a:
$(CC) -o build/libt1.o $(CFLAGS) -c $(wildcard $(SOURCES_DIR)/libt1/*.c)
ar rcs lib/libt1.a build/libt1.o