CMake----从入门到热爱(一)

本文对比了CMake与Make的区别,并详细介绍了CMake的使用方法,包括配置文件CMakeLists.txt的编写规范、变量设置与读取、自动化编译流程等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CMake与Make最简单直接的区别

写程序大体步骤为:

1.用编辑器编写源代码,如.c文件。

2.用编译器编译代码生成目标文件,如.o。

3.用链接器连接目标代码生成可执行文件,如.exe。

但如果源文件太多,一个一个编译时就会特别麻烦,于是人们想到,为什么不设计一种类似批处理的程序,来批处理编译源文件呢,于是就有了make工具,它是一个自动化编译工具,你可以使用一条命令实现完全编译。但是你需要编写一个规则文件,make依据它来批处理编译,这个文件就是makefile,所以编写makefile文件也是一个程序员所必备的技能。

对于一个大工程,编写makefile实在是件复杂的事,于是人们又想,为什么不设计一个工具,读入所有源文件之后,自动生成makefile呢,于是就出现了cmake工具,它能够输出各种各样的makefile或者project文件,从而帮助程序员减轻负担。但是随之而来也就是编写cmakelist文件,它是cmake所依据的规则。所以在编程的世界里没有捷径可走,还是要脚踏实地的。

所以流程如下:


Cmake介绍

cmake要求项目工程主目录和所有存放源代码的子目录都要编写CMakeLists.txt文件。

变量设置变量读取
set(key value)${key}

IF控制语句中变量直接使用变量名,获取环境变量设置ENV{VAR}

通过示例进行说明
#1.cmake verson,指定cmake最低版本,建议写,防止功能不支持 
cmake_minimum_required(VERSION 3.2)

#2.project name,指定项目的名称,一般和项目的文件夹名称对应
#设置变量  语法:set(<variable> <value>... [PARENT_SCOPE])
SET(PROJECT_NAME test)

#指定项目名称 语法:project(projectname [cxx] [c] [java]) 不指定语言默认支持所有语言
PROJECT(${PROJECT_NAME})

#3.head file path,头文件目录,可以多个目录
INCLUDE_DIRECTORIES(include)

#4.source directory,源文件目录,只能一个目录
AUX_SOURCE_DIRECTORY(src DIR_SRCS)

#5.set environment variable,设置环境变量,编译用到的源文件全部都要放到这里,否则编译能够通过,但是执行的时候会出现各种问题,比如"symbol lookup error xxxxx , undefined symbol",可有可无
SET(TEST_MATH ${DIR_SRCS})

#调试打印变量值
MESSAGE(STATUS "src:" ${DIR_SRCS})

#6.add executable file,添加要编译的可执行文件,第二个参数为
#生成可执行文件:add_executable(<name> [source1] [source2 ...])
#生成库:add_library(<name> [STATIC | SHARED | MODULE] [source1] [source2 ...])  默认静态库
ADD_EXECUTABLE(${PROJECT_NAME} ${TEST_MATH})

#7.add link library,添加可执行文件所需要的库,比如我们用到了libm.so(命名规则:lib+name+.so),就添加该库的名称。将库与执行文件进行链接
TARGET_LINK_LIBRARIES(${PROJECT_NAME} m)

创建build文件夹
mkdir build
cd build
cmake ..
make
就可以看到build下有test执行文件
如果源文件在多个目录中,需要编写多个CMakeLists.txt

主文件中添加
#语法: ADD_SUBDIRECTORY(source_dir [binary_dir] [EXCLUDE_FROM_ALL])
ADD_SUBDIRECTORY(subdir)

子文件
AUX_SOURCE_DIRECTORY(. DIR_TEST1_SRCS)
ADD_LIBRARY(Test ${DIR_TEST1_SRCS})

添加链接目录,区别去target_link_libraries,指定链接目录

LINK_DIRECTORIES

预定义的变量

CMAKE_CURRENT_SOURCE_DIR:当前CMakeLists.txt所在文件夹
PROJECT_BINARY_DIR:外部构建中,指的是build目录
PROJECT_SOURCE_DIR:项目所在目录
EXECUTABLE_OUTPUT_PATH:设置执行文件输出路径
LIBRARY_OUTPUT_PATH :设置库输出路径

更过查看:https://cmake.org/cmake/help/v3.14/manual/cmake-commands.7.html

 
 
 
 

参考地址:

https://blog.csdn.net/weixin_42491857/article/details/80741060

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值