Linux C Makefile编译

    xiaoxiao2021-03-25  103

    下面是一个Linux 编译c 线程的Makefile例子。

    ################################################################################

    # $@ 表示规则中的目标文件集。获取所有的目标文件 # # $% 仅当目标是函数库文件中,表示规则中的目标成员名。例如, # 如果一个目标是"foo.a(bar.o)",那么,"$%"就是"bar.o","$@"就是 "foo.a"。 # 如果目标不是函数库文件(Unix下是[.a],Windows下是[.lib]),那么,其值为空。 # # $< 依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的, # 那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。 # # $? 所有比目标新的依赖目标的集合。以空格分隔。 # # $^ 所有的依赖目标的集合。以空格分隔。如果在依赖目标中有多个重复的, # 那个这个变量会去除重复的依赖目标,只保留一份。 ################################################################################ define find-source-file $(foreach dir, $(1), $(wildcard $file)/*.c) endef define find-include-file $(foreach dir, $(1), -I$(dir)) endef define mkdir-dir if [ ! -d "$(1)" ]; then \ $(MKDIR) $(1); \ fi endef SRC_PATH := . src INC_PATH := . include SOURCE := $(call find-source-file, $(SRC_PATH)) OBJS := $(patsubst %.c, %.o, $(SOURCE)) MODULE := main CC := gcc OUT_PATH := out INCLUDE := $(call find-include-file, $(INC_PATH)) CFLAGS := -lpthread $(INCLUDE) LIBS := LD := AR := MKDIR := mkdir -p .PHONY: all all: preinit $(MODULE) endcomplie $(MODULE): $(OBJS) $(CC) -o $@ $^ $(CFLAGS) %.o: %.c $(CC) -c $< -o $@ $(CFLAGS) preinit: $(call mkdir-dir, $(OUT_PATH)) endcomplie: mv *.o $(MODULE) $(OUT_PATH) clean: rm -rf $(OUT_PATH)

    由于Makefile有隐含规则,所以只要按规则来定义一些编译变量,例子中的%.o:%.c规则可以注释。

    下面是所有隐含规则中会用到的变量:

    我们可以把隐含规则中使用的变量分成两种:一种是命令相关的,如“CC”;一种是参数相的关,如“CFLAGS”。 1、关于命令的变量。  AR      函数库打包程序。默认命令是“ar”。  AS      汇编语言编译程序。默认命令是“as”。 CC      C语言编译程序。默认命令是“cc”。 CXX      C++语言编译程序。默认命令是“g++”。 CO      从 RCS文件中扩展文件程序。默认命令是“co”。 CPP      C程序的预处理器(输出是标准输出设备)。默认命令是“$(CC) –E”。 FC      Fortran 和 Ratfor 的编译器和预处理程序。默认命令是“f77”。 GET      从SCCS文件中扩展文件的程序。默认命令是“get”。  LEX      Lex方法分析器程序(针对于C或Ratfor)。默认命令是“lex”。 PC      Pascal语言编译程序。默认命令是“pc”。 YACC      Yacc文法分析器(针对于C程序)。默认命令是“yacc”。 YACCR      Yacc文法分析器(针对于Ratfor程序)。默认命令是“yacc –r”。 MAKEINFO      转换Texinfo源文件(.texi)到Info文件程序。默认命令是“makeinfo”。 TEX      从TeX源文件创建TeX DVI文件的程序。默认命令是“tex”。 TEXI2DVI      从Texinfo源文件创建军TeX DVI 文件的程序。默认命令是“texi2dvi”。 WEAVE      转换Web到TeX的程序。默认命令是“weave”。 CWEAVE      转换C Web 到 TeX的程序。默认命令是“cweave”。 TANGLE      转换Web到Pascal语言的程序。默认命令是“tangle”。 CTANGLE      转换C Web 到 C。默认命令是“ctangle”。 RM      删除文件命令。默认命令是“rm –f”。 2、关于命令参数的变量 下面的这些变量都是相关上面的命令的参数。如果没有指明其默认值,那么其默认值都是空。 ARFLAGS      函数库打包程序AR命令的参数。默认值是“rv”。 ASFLAGS      汇编语言编译器参数。(当明显地调用“.s”或“.S”文件时)。  CFLAGS      C语言编译器参数。 CXXFLAGS      C++语言编译器参数。 COFLAGS      RCS命令参数。  CPPFLAGS      C预处理器参数。( C 和 Fortran 编译器也会用到)。 FFLAGS      Fortran语言编译器参数。 GFLAGS      SCCS “get”程序参数。 LDFLAGS      链接器参数。(如:“ld”) LFLAGS      Lex文法分析器参数。 PFLAGS      Pascal语言编译器参数。 RFLAGS      Ratfor 程序的Fortran 编译器参数。 YFLAGS      Yacc文法分析器参数。

    参考文献:

    所有隐含规则中会用到的变量参考:http://www.cnblogs.com/zengkefu/p/5539936.html

    转载请注明原文地址: https://ju.6miu.com/read-10259.html

    最新回复(0)