关于Makefile文件的书写和Cmake

*(此贴为学习总结,谨慎参考)*
假设我们有以下三个文件 hellomake.c, hellofunc.c, hellomake.h
如果不写makefile文件,那么在编译时需要在terminal直接编译,这种办法有不足(省)

//    gcc -o 编译后的程序名 需要编译的.c文件 编译标志
//(注意每个gcc前面都应该有一个Tab)
//例如:
    gcc -o hellomake hellomake.o hellofunc.o -I.

因此,可以构建makefile文件来提前定义好编译规则,然后直接用make命令执行,最简单的makefile文件可以写成下面这样(假设文件都在当前目录):

//假设这些文件都在当前目录
hellomake: hellomake.o hellofun.o //冒号左边是目标程序,右边是生成目标文件所需要的依赖文件
    gcc -o hellomake hellomake.o hellofun.o -I. //-I.表示从当前目录获取头文件
hellomake.o: hellomake.c //书写每个.o文件的规则
    gcc -c hellomake.c
hellofun.o: hellofun.c
    gcc -c hellofun.c

除了使用makefile简单书写方式以外,优化后还可以是这样:

IDIR = ../include 
CC=gcc //定义编译器
CFLAGS=-I$(IDIR) //定义读取头文件的地址,默认是-I.。

ODIR=obj //可以设置.o文件的目录
LDIR=../lib

LIBS=-lm //定义math库

_DEPS=hellomake.h
DEPS=$(pathsubst %,$(IDIR)/%,$(_DEPS)) //头文件(包含路径)

_OBJ= hellomake.o hellofunc.o
OBJ = $(pathsubst %,$(ODIR)/%,$(_OBJ)) //生成的.o文件(包含路径)

hellomake:$(OBJ)
    $(CC) -o $@ $^ $(CFLAGS) $(LIBS) //$@ $^分别表示:左边和右边  $^表示规则中所有依赖
$(ODIR)/%.o:%.c $(DEPS)
    $(CC) -c $< -o $@ $(CFLAGS) //$@表示将输出文件命名为:左边的文件名, $<表示依赖列表中的第一个项
    
.PHONY:clean //.PHONY规则可以让make不去改动任何名为clean的文件(如果有的话)
clean:
    rm -f $(ODIR)/*.o *~ core $(INCDIR)/*~  //文件清理

Cmake工具

CMake(Cross platform Make)是一个开源的跨平台自动化构建工具, 可以跨平台地生成各式各样的 makefile 或者 project 文件,支持利用各种编译工具生成可执行程序或链接库。

一般 makefile 文件比较复杂,自己去编写比较麻烦, 而利用 CMake 就可以编写相对简单的 CMakeLists.txt ,CMakeLists.txt 需要手工编写,也可以通过编写Python脚本进行半自动的生成。由 CMake 根据 CMakeLists.txt 自动生成 makefile,然后就可以用 make 生成可执行程序或链接库。

cmake_minimum_required (VERSION 2.8) //版本号

project (demo) //工程名

//注意aux_source_directory和set二选一就行

set( SRC_LIST
     ./main.c
     ./hellofun.c
     ./hellomake.c) //set可以将依赖文件统一放在SRC_LIST下面


add_executable(hellomake ${SRC_LIST}) //main是待生成的主程序文件 ${SRC_LIST}是依赖文件
cmake_minimum_required (VERSION 2.8) //版本号

project (demo) //工程名

//注意aux_source_directory和set二选一就行

aux_source_directory(. SRC_LIST) //默认当前目录文件下除.txt以外的其他文件都是需要放在SRC_LIST里的,如果有一部分文件不需要,则可以用set来指定文件

add_executable(hellomake ${SRC_LIST}) //main是待生成的主程序文件 ${SRC_LIST}是依赖文件

猜你喜欢

转载自blog.csdn.net/new_0428/article/details/129974946