我正在处理一个C项目,我决定将源代码及其对象放在不同的目录中。根目录有类似的东西:
SmartC ▶ tree -L 1
.
├── built
├── doc
├── Makefile
├── README.md
├── src
├── tests
└── trash
因此,在src和内置目录中,我将另外两个Makefile用于编译和链接作业。
src目录(我放置源代码的地方)具有以下结构:
src
├── graph.c
├── graph.h
├── list.c
├── list.h
├── main.c
├── Makefile
├── node.c
├── node.h
├── tree.c
├── tree.h
└── types
├── complex.c
├── complex.h
├── matrix.c
└── matrix.h
并且构建具有相同的结构,但它旨在存储通过编译生成的所有对象。
我的问题是关于我的src / Makefile:
BINDIR = ../built/src
CC = gcc
CFLAGS = -g -Wall -O3
OBJECTS = \
$(BINDIR)/main.o \
$(BINDIR)/node.o \
$(BINDIR)/list.o \
$(BINDIR)/graph.o \
$(BINDIR)/tree.o \
$(BINDIR)/types/complex.o \
$(BINDIR)/types/matrix.o \
compile: $(OBJECTS)
$(BINDIR)/%.o: %.c
$(CC) -c $< -o $@ $(CFLAGS)
这个Makefile在src目录中创建源代码的所有对象,并将它们移动到built / src。但是,每次我创建一个新的源代码文件(* .c)时,我都必须将其对象的名称放在这个makefile中,这样就可以编译它。我想在src目录中进行自动搜索,并填写&#34; OBJECTS&#34;这个搜索变量。
有没有人知道如何做到这一点?我的意思是,自动搜索特定目录中的源代码?
我甚至接受任何其他策略而不是我正在制作的策略。
===========回答===============
我得到了关于通配符的提示(在评论中)。所以我做了。这是我找到的解决方案。
的src /生成文件
BINDIR = ../built/src
CC = gcc
CFLAGS = -g -Wall -O3
OBJECTS := $(patsubst %.c,$(BINDIR)/%.o,$(wildcard *.c */*.c))
compile: $(OBJECTS)
$(BINDIR)/%.o: %.c
$(CC) -c $< -o $@ $(CFLAGS)
答案 0 :(得分:1)
我喜欢做以下事情。
$query = "INSERT INTO users (username,password) VALUES ('$username','$password')";
error_reporting(E_ALL);
ini_set('display_errors', 1);
SRCDIR = src
OBJDIR = obj
LIBDIR = lib
DOCDIR = doc
HDRDIR = include
CFLAGS = -g -Wall -O3
STRUCTURE := $(shell find $(SRCDIR) -type d)
CODEFILES := $(addsuffix /*,$(STRUCTURE))
CODEFILES := $(wildcard $(CODEFILES))
使用这种方法,你可以看到我只使用STRUCTURE变量来获取SRCDIR目录中的文件,但它也可以用于其他目的,比如一旦STRUCTURE存储就镜像OBJDIR中的SRCDIR只有内部子目录。在诸如以下的清洁操作之后,它非常有用。
# Filter Only Specific Files
SRCFILES := $(filter %.c,$(CODEFILES))
HDRFILES := $(filter %.h,$(CODEFILES))
OBJFILES := $(subst $(SRCDIR),$(OBJDIR),$(SRCFILES:%.c=%.o))
# Filter Out Function main for Libraries
LIBDEPS := $(filter-out $(OBJDIR)/main.o,$(OBJFILES))
注意:编译规则只适用于每个* .c都有相应的* .h文件(具有相同的基本名称,我的意思)。