Makefile与CMake

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限时加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

Makefile

会检测依赖文件列表中的变动,如果有改动,就重新编译。否则直接使用编译后的Object文件。
举个例子:

//hellomake.c
#include <hellomake.h>

int main(){
	myPrintHelloMake();
	return 0;
	}
//hellomake.h
void myPrintHelloMake();
//hellofunc.c

void myPrintHelloMake(){
printf("Hello makefile\n")
}
##Makefile
CC=gcc
CFLAGS=-I.
hellomake:hellomake.o hellofunc.o
	$(CC) -o hellomake hellomake.o hellofunc.o

hellomake表示冒号后边表示规则,可以认为是一种依赖关系,make会检测这些依赖关系的变化,只有有变化的文件才重新build,这个Makefile的缺陷是如果头文件改动,make并不会重新build

编译单个目标文件

CC :=gcc
CXX :=gcc
CFLAGS :=--std=c++11 -fPIC -shared -O3 -NDEBUG
CXXFLAGS :=--std=c++11 -fPIC -shared -O3 -NDEBUG
INCLUDES := -I.
LIBS_PATH := -L. -L/usr/lib
LIBS := -lstdc++ -lpthread
SRCS :=./hellomake.c
#读依赖的源文件和头文件,生成object文件。%表示替换,即取所有xxx.o的"xxx"
%.o:%.c %.h
	$(CC) $(CFLAGS)  $(INCLUDES)  -c $<  -o $@

CMake

CMake默认变量

  • CMAKE_SOURCE_DIR:cmake命令开始的目录,也叫source tree 根目录
  • CMAKE_CURRENT_SOURCE_DIR:目前正在处理的CMakeLists.txt 所在位置。
  • CMALE_C_COMPLIER :C代码编译器
  • CMAKE_CXX_COMPLIER: C++代码编译器
  • CMAKE_BUILD_TYPE:生成二进制的类型,分为Debug和Release

版本要求命令

设置cmake工具最低版本

CMAKE_MINIMUM_REQUIRED(VERSION 2.8)

PROJECT命令

设置项目名,可以指定编译语言

project(<PROJECT-NAME> [LANGUAGES] [<language-name>...])

SET命令

设置变量的值

set(<variable> <value>
    [[CACHE <type> <docstring> [FORCE]] | PARENT_SCOPE])

例子:

##设置源码文件名
set(SRC_LIST helloworld.cpp)
##设置环境变量
set(ENV($PATH) /home/chifred/vcs/bin
#覆盖Cmake默认编译选项
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DDEBUG_LOG=1")

若要引用上面的源码文件名,如下:

${SRC_LIST}

INCLUDE_DIRECTORIES命令

添加include目录

include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...])

ADD_SUBDIRECTORY命令

常用于添加一个子目录用于编译。比如一个目录包含一个top-level的CMakeLists,该目录下有不同的子目录,包含不同模块的源码,子目录又包含自己的CMakeLists,这个时候top-level的CMakelists需要用add_subdirectory命令包含子目录。

ADD_SUBDIRECTORY

LINK_DIRECTORIES命令

添加链接库目录

link_directories(directory1 directory2 ...)

TARGET_LINK_LIBRARIES命令

为某个的target链接一个或多个库,target名在前,库名在后

target_link_libraries(<target> [item1 [item2 [...]]]
                      [[debug|optimized|general] <item>] ...)

例子:

##把target与libsystemc.a库链接
TARGET_LINK_LIBRARIS(${PROJECT_NAME} systemc)

ADD_EXECUTABLE命令

添加可执行文件

add_executable(<name> [WIN32] [MACOSX_BUNDLE]
               [EXCLUDE_FROM_ALL]
               source1 [source2 ...])

例子

##从源文件生成helloworld的可执行文件
ADD_EXECUTABLE(helloworld helloworld.cpp)

ADD_DEPENDENCIES命令

使top-level的target依赖于其他的target,确保top-level的target编译前,其他target已经编译。

add_dependencies(aarch64_toplevel simplecpu)

这个target是通过add_executeable命令或add_library命令指定的。

FIND_FILE命令

查找文件的完整路径

find_file (
          <VAR>
          name | NAMES name1 [name2 ...]
          [HINTS path1 [path2 ... ENV var]]
          [PATHS path1 [path2 ... ENV var]]
          [PATH_SUFFIXES suffix1 [suffix2 ...]]
          [DOC "cache documentation string"]
          [NO_DEFAULT_PATH]
          [NO_CMAKE_ENVIRONMENT_PATH]
          [NO_CMAKE_PATH]
          [NO_SYSTEM_ENVIRONMENT_PATH]
          [NO_CMAKE_SYSTEM_PATH]
          [CMAKE_FIND_ROOT_PATH_BOTH |
           ONLY_CMAKE_FIND_ROOT_PATH |
           NO_CMAKE_FIND_ROOT_PATH]
         )

例子:

##搜索指定目录和文件名的文件,返回完整文件路径
FIND_FILE(FILE_NAME
		  helloworld.cpp
		  PATHS /home/chifred/c++/project
		  )

MESSAGE命令

显示字符信息,变量和字符串之间要有空格,不然cmake会出warning

条件判断语法

跟C中宏定义有点相似,注意括号的区别

if  (FPGA_SUPPORT)
	set(FPGA_CFLAS "-DFPGA_SUPPORT=1")
else ()
	set(FPGA_CFLAS "-DFPGA_SUPPORT=0")
endif()

find_package命令

如果需要外部的包,需要cmake在编译时去找对应的头文件路径、库文件路径、库名。find_package命令语法入下:

FIND_PACKAGE( <name> [version] [EXACT] [QUIET] [NO_MODULE] [ [ REQUIRED | COMPONENTS ] [ componets... ] ] )

find_package会去CMAKE_MODULE_PATH指定的目录中寻找Findname.cmake并执行。所以要修改CMAKE_MODULE_PATH变量,并且自己写Findename.cmake文件。例子如下

#添加存放.cmake文件的路径
set(CMAKE_MODULE_PATH $CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake"

find_package(Lua)
if(LUA_FOUND)
	include_directories(${LUA_INCLUDE_DIR})
else()
	message(FATAL_ERROR "LUA library not found")
endif ()

上述会去cmake文件夹下搜索FindLua.cmake文件,并执行。这个.cmake文件会设置搜索头文件和库文件的路径。找到包以后,会自动设置下面的变量。

<name>_FOUND
<name>_INCLUDE_DIRS or <NAME>_INCLUDES
<name>_LIBRARIES or <name>_LIBRARIES or <name>_LIBS
<name>_DEFINITIONS
Linux Makefile:使用CMake生成Makefile文件_cmakemakefile 从前面几个case中可以看到,如果不这样做,cmake运行时生成的附带文件就会跟源码文件混在一起,这样会对程序的目录结构造成污染,而在build目录下运行cmake,生成的附带文件就只会待在build目录下,如果我们不想要这些文件了就可以直接清空build目录,非常方便。正规一点来说,一般会把源文件放到src目录下,把头文件放入到include文件下,生成的对象文件放入到build目录下,最终输出的elf文件会放到bin目录下,这样整个结构更加清晰。既然我们已经生成了库,那么就进行链接测试下。 阅读详情

相关推荐

CmakeMakefile

开始学Linux, 说实话还真的很痛苦 在Linux中写好一个c++程序, 需要两个过程才能形成一个可执行文件: compile和link Compile是编译过程, 也就是把源文件生成一些中间目标文件.obj Link是将这些.obj文件和library file中的.lib文件链接起来,并且生成可执行文件 .a 一般可以自己写makefile文件, 来预设上述过程所需的前

读博记事本 1879

centos7下编译安装make-3.13.2

1.下载cmake源码 [root@localhost download]# wget https://github.com/Kitware/CMake/releases/download/v3.13.2/cmake-3.13.2.tar.gz 2.解压 cmake-3.11.2.tar.gz 文件 [root@localhost download]# tar -zxvf cmake-3...

MaxMaxXiong的博客 3123

cmake-3.13.4.tar.gz

LinuxUnix的Cmake压缩包,由于直接从官网下载速度过慢所以传上来。

linux安装编译cmake,centos7下编译安装cmake-3.13.2

安装wget[root@laofuxi.com src]# yum -y install wget下载源码[root@laofuxi.com src]# wget https://github.com/Kitware/CMake/releases/download/v3.13.2/cmake-3.13.2.tar.gz解压源码[root@laofuxi.com src]# tar zxvf cma...

weixin_39765697的博客 415

centos7 cmake: 未找到命令 (cmake cannot found) 安装3.13.2 笔记

1. 官网下载cmake-3.12.2.tar.gz; https://github.com/Kitware/CMake/releases/download/v3.13.2/cmake-3.13.2.tar.gz 2. 解压到指定目录; tar -zxvf cmake-3.13.2.tar.gz 3、进入解压后的目录,依次运行指令 ./bootstrap &amp;&amp; make ...

Nankys的博客 1万+

CentOS7重新安装cmake

CMake Error at CMakeLists.txt:24 (cmake_minimum_required): CMake 3.1.3 or higher is required. You are running version 2.8.12.2 -- Configuring incomplete, errors occurred!

qq_38229263的博客 3860

MakefileCMake

本文介绍了从MakefileCMake的演进过程,重点比较了两者的特点和使用方法。Makefile是直接用于编译的工具,而CMake作为更高层次的配置工具,能够生成Makefile文件。文章详细讲解了Makefile的基础语法、变量使用和自动变量等特性,以及如何通过模式规则实现自动化编译。在CMake部分,系统梳理了CMakeLists.txt的基本结构,包括版本声明、项目设置、编译选项、子目录管理、头文件/库文件链接、可执行文件/库文件的生成规则等核心内容

yuwei021的博客 1107

什么是CmakeMakefile

目录 1.前言 2.什么是Makefile 3.什么是Cmake 4.Cmake的语法规则 1.前言 在学习视觉SLAM十四讲的时候,对这个Cmake的概念不太清楚(笔者是机械方向转到SLAM这个方向的),在看了很多大神的讲解后,有所收获,写下这篇笔记方便复习(如果写的有什么不对的地方欢迎批评指正),也希望对各位读者有所帮助。在我看到关于Cmake的解释中,有篇文章写的非常通俗易懂,该链接我放在了下方,建议读者可以看看。 什么是Cmakehttps://www.hahack.com/.

m0_63647490的博客 5419

MakefileCmake

makefile工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式—通过调用makefile文件中用户指定的命令来进行编译和链接的。CMake允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。

qq_74811378的博客 952

cmakemakefile区别

cmakemakefile区别

weixin_38834817的博客 1807

makefilecmake的基础使用

讲解makefilecmake的简单用法

记录一位C++爱好者的笔记 2706

CMake 生成makefile 步骤

1、首先创建一个目录下的makefile //main.cpp #include<iostream> using namespace std; int main() { cout<<"Hello word!"<<endl; return 0; } 在main文件所在的目录创建CMakeLists.txt //CMakeLists.txt ...

machuanfei_c的专栏 1万+

Makefile CMake 关系指南

MakefileCMake是C/C++项目构建中的核心工具,二者协同工作形成完整构建链:CMake作为构建生成器,根据CMakeLists.txt生成平台特定的Makefile,再由Makefile指导实际编译过程。Makefile适合小型单一平台项目,语法直接但跨平台性弱;CMake支持跨平台开发,能自动管理依赖并集成测试,适合中大型项目。现代开发推荐组合使用:CMake生成Makefile,再通过make命令编译。

Youngist的博客 1203

make、makefilecmake之间的区别联系

make、makefilecmake之间的区别联系 首先说明一下make、makefilecmake存在的原因 在进行编译时,如果程序只有一个源文件,那么我们可以直接利用gcc命令对其进行编译; 但是,如果程序包含多个源文件的话,用gcc命令对源文件进行逐个编译显然会比较繁琐。尤其是在有大量源文件时,这样繁琐的编译工作很容易会导致混乱; 为了使多个源文件的编译工作更加便捷,就出现了make...

Aiyanghong的博客 6670

CMakemakefile的区别

最好写上,它会引入两个变量 demo_BINARY_DIR 和 demo_SOURCE_DIR,同时,cmake 自动定义了两个等价的变量 PROJECT_BINARY_DIR 和 PROJECT_SOURCE_DIR。CMakeLists.txt 使用 CMake 的自定义语言,其语法更加清晰和可读,具有更高的抽象层次,使得配置和生成过程更加简单。CMakeLists.txt 更适合管理大型、复杂和跨平台的项目,而 Makefile 通常更适合小型项目或特定于某个平台的项目。

Artisan_w 2132

MakefileCmake的联系区别

CMake是一种跨平台编译工具,比make更为高级,使用起来要方便得多。CMake主要是编写CMakeLists.txt文件,然后用cmake命令将CMakeLists.txt文件转化为make所需要的makefile文件,最后用make命令编译源码生成可执行程序或共享库(so(shared object)).它的作用和qt的qmake是相似的。   C/C++程序员肯定离不开Makefile...

dickshell的专栏 1万+

CMakeMakefile关系

Makefile是make工具的输入文件,定义了如何构建项目。它适用于手动编写简单项目的构建规则,但在处理复杂项目时可能较为繁琐。CMake是一个更高级的构建系统生成工具,通过文件描述项目的构建过程,再生成特定平台的构建文件(包括Makefile它提供了更多的高级功能和更好的跨平台支持。简而言之,CMake可以被看作是一个更强大、跨平台的项目构建和管理工具,它能够生成Makefile,同时还能够生成其他类型的构建文件,简化复杂项目的构建和管理。下一篇文章讲解 CMake如何生成makefile文件。

yueyuanhuaqing的专栏 1157

使用CMake调用Makefile 项目

使用CMake调用Makefile 项目

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 3662
上一篇: 标记化结构初始化
chifredhong
博客等级 码龄12年 11粉丝 17原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值