欢迎大家访问我的个人博客。
起因
最近在看 APUE,里面有很多小的例子可以用来练手。不过这就有一个问题了:APUE 有一个公用的头文件和自己封装的错误处理例程,每次编译要指定相应的目录和文件确实是很麻烦。make 确实可以解决这个问题,但是如何指定要编译的文件就是一个问题。所以,我们现在的问题是:如何让 makefile 可以指定要编译的文件。经过一方摸索之后,总算是解决了这个问题。
Solution
我的解决方法很简单,就是通过引入 shell 的环境变量。我定义了一个环境变量 CUR ,用来指定当前要编译的文件名。然后通过 makefile 里面的 shell 函数,通过 printenv CUR
在 makefile 获取当前要编译的文件名。
同时,为了方便,我想要复用这个 makefile,所以我先将这个 makefile 放在一个固定的位置,然后在我的 shell 配置文件(我用的是 zsh,所以配置文件是 .zshrc,如果你用的是 bash,那么就是 .bashrc,其他类推)使用一个函数,每次调用都使用这个 makefile 模板来编译(可以使用 make 的 -f 参数来指定 makefile)。
好了,说了这么多,我把我的 makefile 模板和 shell 相应的函数放上来跟大家一起共享,欢迎讨论。
LIB_PATH = ~/Code/libs
SRC_PATH = ./
INCLUDE_PATH = $(LIB_PATH)
LIB = $(wildcard $(LIB_PATH)/*.c)
INCLUDE = $(wildcard $(LIB_PATH)/*.h)
CUR = $(shell printenv CUR)
DEBUG = -g
all: $(LIB) $(INCLUDE) $(CUR)
gcc -I $(INCLUDE_PATH) $(LIB) $(CUR) -o $(subst .c,.o,$(CUR))
debug: $(LIB) $(INCLUDE) $(CUR)
gcc -I $(INCLUDE_PATH) $(LIB) $(CUR) $(DEBUG) -o $(subst .c,.debug,$(CUR))
go() {
export CUR="$1"
make -f ~/Templates/Makefile
}
de() {
export CUR="$1"
make -f ~/Templates/Makefile debug
}
这样,我们只需要在要编译的时候,使用 go 你要编译的文件名
就可以了直接编译了,使用 de 你要编译的文件名
就可以编译可以用 gdb 调试的文件了。有种指哪打哪的快感!
欢迎大家关注我的微信公众号: