Linux下makefile通用模版

  1. #*******************************************************************************  
  2. #  File name  : Makefile  
  3. #  Author     : weiming   
  4. #  Date       : 2012/06/14  
  5. #  cmd        : make  
  6. #*******************************************************************************  
  7.   
  8. #编译后可执行程序名称,可根据实际情况修改  
  9. SER_NAME = WM_SER     
  10. M_DATE=`date '+%y%m%d'`  
  11.   
  12.   
  13. #编译选项  
  14. CXX = g++  
  15. AR  = ar cr  
  16. COMPILE_FLAGS = -Wall  -ggdb -fpermissive  
  17.   
  18. #头文件路径,可根据实际情况增减  
  19. INCLUDE_PATH = -I. -I$(ORACLE_HOME)/rdbms/demo  -I$(ORACLE_HOME)/rdbms/public  
  20.   
  21. #链接库路径,可根据实际情况增减  
  22. #注意ORACLE库路径是否正确  
  23. LIB_PATH = -L. -L$(ORACLE_HOME)/lib    
  24.   
  25. #链接库,可根据实际情况增减  
  26. LIBS= -lclntsh -lpthread  
  27.   
  28. #源码文件,当前目录下所有cpp文件  
  29. SRC= $(wildcard *.cpp)    
  30.   
  31. #中间文件.o  
  32. OBJS=$(SRC:.cpp=.o)  
  33.   
  34.   
  35. #Makefile的终极目标all  
  36. all : $(OBJS) $(SER_NAME)  
  37.   
  38. .PHONY:all clean  
  39.   
  40.   
  41. $(SER_NAME):$(OBJS)  
  42.     $(CXX) -o $(SER_NAME)_$(M_DATE) $(OBJS) $(INCLUDE_PATH) $(LIB_PATH) $(LIBS)  
  43.   
  44. %.o : %.cpp  
  45.     $(CXX) -c $(COMPILE_FLAGS) $(INCLUDE_PATH) $< -o $@  
  46.   
  47. clean:  
  48.     -rm *.o $(SER_NAME)_$(M_DATE)  
  49.   
  50. #可根据实际情况修改  
  51. #install  
  52. #    ....  

 makefile相关知识点疑问解答:

 

1、模式规则示例
下面这个例子表示了,把所有的[.c]文件都编译成[.o]文件.
%.o : %.c
$(CC) -c $(CFLAGS) $(CPPFLAGS) $< -o $@
其中,"$@"表示所有的目标的挨个值,"$<"表示了所有依赖目标的挨个值。这些奇怪的变量我们叫"自动化变量",后面会详细
讲述。

2、变量高级用法
这里介绍两种变量的高级使用方法,第一种是变量值的替换。
我们可以替换变量中的共有的部分,其格式是“$(var:a=b)”或是“${var:a=b}”,其意思是,把变量“var”中所有以“a”字
串“结尾”的“a”替换成“b”字串。这里的“结尾”意思是“空格”或是“结束符”。
还是看一个示例吧:
foo := a.o b.o c.o
bar := $(foo:.o=.c)
这个示例中,我们先定义了一个“$(foo)”变量,而第二行的意思是把“$(foo)”中所有以“.o”字串“结尾”全部替换成“.c”,
所以我们的“$(bar)”的值就是“a.c b.c c.c”。
另外一种变量替换的技术是以“静态模式”(参见前面章节)定义的,如:
foo := a.o b.o c.o
bar := $(foo:%.o=%.c)
这依赖于被替换字串中的有相同的模式,模式中必须包含一个“%”字符,这个例子同样让$(bar)变量的值为“a.c b.c c.c”。
第二种高级用法是——“把变量的值再当成变量”。先看一个例子:
x = y
y = z
a := $($(x))
在这个例子中,$(x)的值是“y”,所以$($(x))就是$(y),于是$(a)的值就是“z”。(注意,是“x=y”,而不是“x=$(y)”)
我们还可以使用更多的层次:
x = y
y = z
z = u
a := $($($(x)))
这里的$(a)的值是“u”,相关的推导留给读者自己去做吧。
让我们再复杂一点,使用上“在变量定义中使用变量”的第一个方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当编写一个通用Makefile 模板时,可以使用以下内容作为起点: ```makefile # 编译器 CC = gcc # 编译选项 CFLAGS = -Wall -Wextra -std=c99 # 目标文件夹 BUILD_DIR = build # 源文件夹 SRC_DIR = src # 源文件后缀 SRC_EXT = c # 获取所有源文件 SRCS = $(wildcard $(SRC_DIR)/*.$(SRC_EXT)) # 获取所有目标文件 OBJS = $(patsubst $(SRC_DIR)/%.$(SRC_EXT), $(BUILD_DIR)/%.o, $(SRCS)) # 目标可执行文件 TARGET = app # 默认目标 all: $(TARGET) # 编译目标文件 $(BUILD_DIR)/%.o: $(SRC_DIR)/%.$(SRC_EXT) mkdir -p $(BUILD_DIR) $(CC) $(CFLAGS) -c $< -o $@ # 构建可执行文件 $(TARGET): $(OBJS) $(CC) $(CFLAGS) $^ -o $@ # 清理生成的文件 clean: rm -rf $(BUILD_DIR) $(TARGET) .PHONY: all clean ``` 这个模板定义了以下几个变量和规则: - `CC`:编译器的名称,此处为 `gcc`,你可以根据需要修改为其他编译器。 - `CFLAGS`:编译选项,例如 `-Wall` 和 `-Wextra` 是常见的警告选项,`-std=c99` 指定了 C99 标准。 - `BUILD_DIR`:目标文件夹的名称,可以根据需要修改。 - `SRC_DIR`:源文件夹的名称,可以根据需要修改。 - `SRC_EXT`:源文件的扩展名,此处为 `c`,你可以根据需要修改为其他扩展名。 - `SRCS`:所有源文件的列表。 - `OBJS`:所有目标文件的列表。 - `TARGET`:可执行文件的名称。 - `all`:默认目标,依赖于 `$(TARGET)`。 - `$(BUILD_DIR)/%.o`:用于将源文件编译为目标文件的规则。 - `$(TARGET)`:构建可执行文件的规则。 - `clean`:清理生成的文件的规则。 使用该模板时,将源文件放置在 `src` 文件夹中,然后运行 `make` 命令即可编译生成可执行文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值