CMake:01 - 入门篇

从事linux的开发工作,不可避免的需要进行编译构建的工作,直接编辑Makefile,不仅需要熟悉Makefile的语法,还需要知道依赖和推导规则,比较麻烦。而cmake工具,只需要开发者提供头文件路径、库路径、编译参数等基本参数,就能快速生成Makefile,语法简单,能够快速上手,另外cmake工具能够满足跨平台的要求,因此应用比较广泛。

下面我们以一个实际的计算器的例子,逐步深入对cmake的学习理解。

一、最简单的例子

在linux平台下使用cmake生成Makefile并编译的通常流程有下面几步:

  • 1、编写cmake配置文件CMakeLists.txt
    通常CMakeLists.txt放在项目顶层目录,根据需要也可在子目录放置。
  • 2、在CMakeLists.txt文件所在目录创建一个build文件夹,然后进入目录。
    不建目录理论上是可行的,但是生成的中间文件不易清理,另外build目录名词也是可以自定义的。
  • 3、执行cmake …/ 生成makefile。
  • 4、执行make和make install进行编译和安装。

下面是一个linux C/C++最简单的程序,“欢迎使用计算器” main.cpp。

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main() {
    printf("Welcome to calculator !\n");
    return 0;
}

我们看一下编译它,需要的CMakeLists.txt如何编写。

#指定使用该CMakeList.txt文件需要的cmake最低版本
cmake_minimum_required(VERSION 3.5)
#指定项目信息
project(calculator)

#设置安装目录
set(INSTALL_DIR ${CMAKE_SOURCE_DIR}/install)

#指定生成目标
add_executable(calculator main.cpp)

#安装到安装目录
INSTALL(TARGETS calculator DESTINATION ${INSTALL_DIR}/usr/bin)

其中,CMAKE_SOURCE_DIR为cmake定义的变量,指定义了顶级CMakeLists.txt的文件夹。
最后执行下面脚本,进行创建build目录、生成Makefile、编译连接、安装的操作。

mkdir build
cd build
cmake ../
make
make install

二、多个源文件的例子

下面我们对上面的例子进行扩展,增加加法运算的函数,add.cpp和add.h文件。

├── add.cpp
├── add.h
├── CMakeLists.txt
└── main.cpp

那现在怎么把增加的文件编译进去呢?我们只需要简单修改一下CMakeLists.txt文件即可。

#指定生成目标,在这里增加文件
add_executable(calculator main.cpp add.cpp)

但是,如果我们继续增加减法运算的函数,sub.cpp和sub.h文件,或者再增加更多文件呢?

├── add.cpp
├── add.h
├── CMakeLists.txt
├── main.cpp
├── sub.cpp
└── sub.h

虽然我们可以继续按照上面的方式添加,但是比较繁琐,我们可以使用aux_source_directory命令,该命令会查找指定目录下的所有源文件,然后将结果存进指定的变量名。

#指定使用该CMakeList.txt文件需要的cmake最低版本
cmake_minimum_required(VERSION 3.5)
#指定项目信息
project(calculator)

#设置安装目录
set(INSTALL_DIR ${CMAKE_SOURCE_DIR}/install)

#查找当前目录下的所有源文件
#并将名称保存到ALL_SRCS变量
aux_source_directory(. ALL_SRCS)

#指定生成目标
#add_executable(calculator main.cpp add.cpp sub.cpp)
add_executable(calculator ${ALL_SRCS})

#安装到安装目录
INSTALL(TARGETS calculator DESTINATION ${INSTALL_DIR}/usr/bin)

三、动态库和静态库的例子

我们继续在上面的例子上进行扩展,增加乘法运算,编译成静态库,增加除法运算,编译成动态库,并最终链接为一个可执行程序。
增加后的文件如下:

├── add.cpp
├── add.h
├── CMakeLists.txt
├── div
│   ├── CMakeLists.txt
│   ├── div.cpp
│   └── div.h
├── main.cpp
├── mul
│   ├── CMakeLists.txt
│   ├── mul.cpp
│   └── mul.h
├── sub.cpp
└── sub.h

我们看到mul和div文件夹下分别有一个CMakeLists.txt子文件,然后在顶层CMakeLists.txt文件中可以对这个进行包含。

mul目录下的CMakeLists.txt文件:

#查找当前目录下的所有源文件
#并将名称保存到MUL_SRCS变量
aux_source_directory(. MUL_SRCS)

#生成静态链接库
add_library(mul STATIC ${MUL_SRCS})

#安装到安装目录
INSTALL(TARGETS mul DESTINATION ${INSTALL_DIR}/usr/lib)

div目录下的CMakeLists.txt文件:

#查找当前目录下的所有源文件
#并将名称保存到DIV_SRCS变量
aux_source_directory(. DIV_SRCS)

#生成动态链接库
add_library(div SHARED ${DIV_SRCS})

#安装到安装目录
INSTALL(TARGETS div DESTINATION ${INSTALL_DIR}/usr/lib)

其中add_library命令能够将指定的源文件根据参数的不同(STATIC/SHARED)编译为静态或者动态链接库。

顶层目录下的CMakeLists.txt文件:

#指定使用该CMakeList.txt文件需要的cmake最低版本
cmake_minimum_required(VERSION 3.5)
#指定项目信息
project(calculator)

#设置安装目录
set(INSTALL_DIR ${CMAKE_SOURCE_DIR}/install)

#添加子目录
add_subdirectory(mul)
add_subdirectory(div)

#包含头文件目录
include_directories(${CMAKE_SOURCE_DIR}/mul)
include_directories(${CMAKE_SOURCE_DIR}/div)

#查找当前目录下的所有源文件
#并将名称保存到ALL_SRCS变量
aux_source_directory(. ALL_SRCS)

#指定生成目标
add_executable(calculator ${ALL_SRCS})

#添加链接库
target_link_libraries(calculator mul)
target_link_libraries(calculator div)

#安装到安装目录
INSTALL(TARGETS calculator DESTINATION ${INSTALL_DIR}/usr/bin)

其中,add_subdirectory命令表示本项目包含一个子目录,include_directories命令表示将指定目录添加到编译器的头文件搜索路径之下,target_link_libraries命令表示可执行文件calculator需要连接一个名为 mul/div的链接库。

注:每次CMakeLists.txt变动,需要重新执行cmake …/生成Makefile文件。
进阶教程:CMake:提高篇

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值