Cmake基础与两个简单实例

一、简介
1.1 cmake 作为构建工具,具有对大项目的管理能力

1.2 特点
①开放源代码
②跨平台:在Linux平台生成Makefile
③能够管理大项目
④工具链简单:cmake+make

1.3 注意事项
每个目录都要有CMakeLists

二、实例1.helloworld
2.1 大概有7步
①新建目录cmake

mkdir cmake

②在cmake下创建目录t1

mkdir t1

③进入目录t1
④在t1目录建立main.c和CMakeLists.txt
main.c

#include <stdio.h>
int main()
{
printf(“Hello World from t1 Main!\n”);
return 0;
}

CMakeLists.txt

PROJECT (HELLO)
SET(SRC_LIST main.c)
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
ADD_EXECUTABLE(hello ${SRC_LIST})

⑤在t1目录下输入指令 cmake .(注意命令后的点号,代表本目录)
输入后发现系统自动生成了很多文件,且生成了Makefile
⑥在t1目录输入指令make
这时,目标文件hello生成
⑦在t1目录输入指令 ./hello 运行
得到输出 Hello World from t1 Main

2.2 解释一下CMakeLists.txt
先简单说3点:
①CMakeLists.txt文件格式:指令名(参数1 参数2 参数3 参数4)
②指令是大小写无关的,参数和变量是大小写相关的
③各个参数用空格隔开,数量可选,但是需要按顺序

PROJECT (HELLO) 
//PROJECT(projectname CXX [C] Java)
//定义工程名称,并可指定工程支持的语言,支持的语言列表是可以忽略的,默认情况表示支持所有语言
//这个指令隐式的定义了两个 cmake 变量:<projectname>_BINARY_DIR以及<projectname>_SOURCE_DIR
//这里就是HELLO_BINARY_DIR和HELLO_SOURCE_DIR,前者为编译路径,后者为工程路径,值都是工程所在路径/cmake/t1
SET(SRC_LIST main.c)
//SET(VAR VALUE)
//显式的定义变量即可,此处将main.c赋值给SRC_LIST
//如果有多个源文件,也可以定义成:SET(SRC_LIST main.c t1.c t2.c)。
MESSAGE(STATUS "This is BINARY dir " ${HELLO_BINARY_DIR})
MESSAGE(STATUS "This is SOURCE dir "${HELLO_SOURCE_DIR})
//MESSAGE(STATUS "message to display" ...)
//用于向终端输出用户定义的信息
//可以输出三种类型的信息:
//①SEND_ERROR,产生错误,生成过程被跳过。
//②SATUS,输出前缀为--的信息。此处为该应用,输出两个由PROJECT函数自动生成的两个变量的值
//在这里的使用变量格式为:${变量名};后文在IF语句中需要使用其他格式
//③FATAL_ERROR,立即终止所有cmake 过程.
ADD_EXECUTABLE(hello ${SRC_LIST})
//定义了这个工程会生成一个文件名为hello 的可执行文件
//这里需要特别解释的是作为工程名的 HELLO 和生成的可执行文件 hello 是没有任何关系的
//你也可以直接写成ADD_EXECUTABLE(hello main.c)
//如果存在另外一个 func.c源文件,就要写成:ADD_EXECUTABLE(hello main.c func.c)

2.3 简化CMakeLists.txt

PROJECT(HELLO)
ADD_EXECUTABLE(hello main.c)

2.4 工程清理

make clean

三、内部构建与外部构建
随便说三点:
①上一个实例是内部构建,下一个实例为外部构建
②外部构建使得工程更加清晰,使用广泛
③不扯概念,实践了就知道区别了

四、实例2.外部构建的helloworld
4.1 大概有5步
①在cmake/目录下建立t2目录
将t1 工程的 main.c和 CMakeLists.txt 拷贝到t2目录中。
②在t2目录下

mkdir src
mv main.c src

现在的工程看起来是这个样子:一个子目录src,一个 CMakeLists.txt。
③在src目录下建立一个 CMakeLists.txt
编写 CMakeLists.txt 如下:

ADD_EXECUTABLE(hello main.c)

④修改t2 目录下的 CMakeLists.txt

PROJECT(HELLO)
ADD_SUBDIRECTORY(src bin)

⑤在t2 目录下建立build 目录,进入build目录进行外部编译

cmake  ..
make

构建完成后,你会发现生成的目标文件 hello 位于 build/bin目录中
4.2 解释一下

ADD_SUBDIRECTORY(src bin)
//ADD_SUBDIRECTORY(source_dir binary_dir)
//将src子目录加入工程,并指定编译输出(包含编译中间结果)路径为bin目录
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值