cmake与make的项目构建快速上手

Posted 帅气的黑桃J

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cmake与make的项目构建快速上手相关的知识,希望对你有一定的参考价值。

简介

cmake工具可以生成makefile文件,makefile文件可以指定一个项目中那些文件需要编译,哪些文件不需要编译,在项目开发中十分重要。

前述知识——C程序编译的过程

  • 预编译

    将.c/.h文件预编译为.i文件,具体地,将.c中的头文件和库文件导入进来;进行宏定义的替换

  • 汇编

    将.i文件转换为.S文件(汇编)

  • 编译

    将.S转换为.o文件(obj二进制文件)

  • 链接

    将.o文件转换为.exe可执行文件(linux中的.elf)

一般的IDE自动完成.c到.exe中间变量的配置,如果自己构建makefile文件,用.c文件生成.exe文件,可以参考如下命令

# eg:用.c获取.exe文件(最简单的编译)
hello.i:hello.c
	gcc -E hello.c -o hello.i
hello.S:hello.i
	gcc -S hello.i -o hello.S
hello.o:hello.S
	gcc -c hello.S -o hello.o
hello:hello.o
	gcc hello.o -o hello

开发环境

  • window10
  • cmake 3.22.2
  • GUN Make 3.82.90

环境配置教程和学习教程

建议:按照顺序学习

cmake特点

  • 跨平台——平台无关
  • 大小写无关

CMake语法介绍

PROJECT

  • 设置项目名——PROJECT

  • PROJECT(HELLO C CXX)为项目名为HELLO,支持c,c++语言

SET

  • 设置变量——SET

  • SET(SRC_LIST main.cpp test.cpp)

MESSAGE

  • 设置消息——MESSAGE

  • MESSAGE(STATUS "THIS IS MY DIR" $HELLO_BINART_DIR)

ADD_EXECUTABLE

  • 生成可执行文件——ADD_EXECUTABLE

  • ADD_EXECUTABLE(HELLO $SRC_LIST)ADD_EXECUTABLE(HELLO main.cpp)

ADD_SUBDIRECTORY

  • ADD_SUBDIRECTORY添加子目录,可以指定中间二进制和目标二进制的存放位置

  • ```ADD_SUBDIRECTORY(src bin)``

    将src子目录加入工程并指定编译输出(包含中间编译结果),路径为bin目录

    如果不指定bin的话,那么编译结果都将放在bulid/src目录下

变量之间可以用空格来分割,也可以用分号来分割

Makefile快速上手

  • 单文件构建项目

    # eg:用.c获取.exe文件(最简单的编译)
    hello:hello.o
    	gcc hello.o -o hello
    hello.i:hello.c
    	gcc -E hello.c -o hello.i
    hello.S:hello.i
    	gcc -S hello.i -o hello.S
    hello.o:hello.S
    	gcc -c hello.S -o hello.o
    

需要注意是:

  • .’.PHONY:’——伪目标,执行额外的命令

    .PHONY:
    # 删除所有文件
    clearall:
    	rm -rf hello.i hello.S hello.o hello
     # 删除过程文件
    clear:
    	rm -rf hello.S hello.i
    

    调用方式(DOS命令):

    # 删除所有文件
    make clearall
    # 删除过程文件
    make clear
    

快速上手

以上是关于cmake与make的项目构建快速上手的主要内容,如果未能解决你的问题,请参考以下文章

cmake

linux工程构建:make,cmake

CMake 错误:CMake 无法找到与“Unix Makefiles”对应的构建程序。 CMAKE_MAKE_PROGRAM 未设置

GNU开发工具——CMake快速入门

比较Make和CMake

如何在不使用 CMake 但仅使用 make 的项目中合并使用 CMake 的仅标头库?