cmake学习

1 安装

sudo apt install cmake
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

检查是否安装成功

cmake --version
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

2 使用cmake来配合程序的编译

2.1 只有一个源文件的程序编译

首先在当前目录下创建两个文件

hello.cpp

#include <iostream>
using namespace std;
 
int main()
{
    cout << "Hello 今天是2023/2/26" << endl;
    return 0;
}
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

CMakeLists.txt (注意CMakeLists大小写,不要写错了)

cmake_minimum_required (VERSION 2.8)
 
project (learn_cmake)
 
add_executable(hello hello.cpp)
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==
  • 第一行意思是cmake最低版本要求2.8,
  • 第二行是本项目的工程名
  • 第三行:第一个变量:要生成的可执行文件名为hello,后面的参数是需要的依赖。

接着在当前目录下执行 cmake .

接着会发现目录下多生成了一些文件,例如Makefile

然后使用GNU make来编译程序

 此时会发现已生成可执行程序,并可以正常执行

2.2 同一目录下多个源文件

此时在当前目录新增两个依赖,并mian函数的执行需要依赖这两个文件

add.cpp

add.h

只需要在CMakeLists.txt中添加所依赖的.cpp文件,编译步骤和上面相同

cmake_minimum_required (VERSION 2.8)
 
project (learn_cmake)
 
add_executable(hello hello.cpp myadd.cpp)
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

2.3 同一目录下很多源文件

如果同一目录下有无穷多源文件,那么一个一个添加就很慢了。此时可以使用cmake中的函数存储这些源文件

aux_source_directory(dir var)

他的作用是把dir目录中的所有源文件都储存在var变量中

然后需要用到源文件的地方用 变量var来取代

此时 CMakeLists.txt 可以这样优化

cmake_minimum_required (VERSION 2.8)
 
project (learn_cmake)

aux_source_directory(. SRC_LIST)
 
add_executable(hello ${SRC_LIST})
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

注意:变量的使用和Makefile不同,CMake是利用大括号,如 ${index}

2.4 头文件在别的文件夹

对于集中的头文件,CMake提供了一个很方便的函数

include_directories ( dir )

他的作用是 自动去dir目录下寻找头文件,相当于 gcc中的 gcc -I dir

此时 CMakeLists.txt 可以这样优化

cmake_minimum_required (VERSION 2.8)
 
project (learn_cmake)

aux_source_directory(. SRC_LIST)

include_directories (./inc_dir)
 
add_executable(hello ${SRC_LIST})
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

2.5 头文件源文件分离,并含有多个文件夹

假如说当前的工程目录是这样的,头文件和源文件分离,并含有多个文件夹

假如说当前的工程目录是这样的,头文件和源文件分离,并含有多个文件夹

根据上面的《三》和《四》。此时 CMakeLists.txt 可以这样优化

根据上面的《三》和《四》。此时 CMakeLists.txt 可以这样优化

# 最低版本
cmake_minimum_required (VERSION 2.8)

# 项目名称
project (learn_cmake)

# 引入头文件路径
include_directories (./inc_dir1 ./inc_dir2)

# 获取某目录下的所有源文件
aux_source_directory (src_dir1 SRC_LIST1)
aux_source_directory (src_dir2 SRC_LIST2)
aux_source_directory (main_dir MAIN_DIR)

# 生成可执行文件
add_executable(hello ${SRC_LIST1} ${SRC_LIST2} ${MAIN_DIR})
wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

2.6 生成动态库和静态库

假如说当前的项目目录是这样的

  • inc目录下存放头文件
  • src目录下存放源文件
  • lib目录下存放生成的库
  • build目录下存放构建项目相关的文件,如CMakeLists.txt。而稍后我们也在这个目录下执行cmake和make

 此时 CMakeLists.txt 可以这样优化

此时 CMakeLists.txt 可以这样优化

解释一下:

  • PROJECT_BINARY_DIR是cmake系统变量,意思是执行cmake命令的目录,我们计划在build目录下执行cmake命令,所以这个变量也就等同于build目录
  • add_library(lib_name STATIC/SHARED src) 
    # 函数作用:生成库。
    # 参数lib_name:是要生成的库名称,
    # 参数STATIC/SHARED:指定生成静态库或动态库,
    # 参数src:指明库的生成所需要的源文件
    wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

    set_target_properties重新定义了库的输出名称,如果不使用set_target_properties也可以,那么库的名称就是add_library里定义的名称。具体可以参考官方文档

  • LIBRARY_OUTPUT_PATH 是cmake系统变量,项目生成的库文件都放在这个目录下。这里我指定库生成到lib目录。

开始编译:

  1. 在build目录下执行 cmake .
  2. 在build目录下执行 make
  3. 查看lib目录下是否生成库文件,

出现库文件就算编译成功 

        

2.7 链接库文件

我们已经在lib目录下生成了库文件,下面我们写一个main函数来使用库文件

目录结构如下:

  • lib目录下存放静态库和动态库
  • main_src目录下存放main函数相关的源文件
  • bin目录存放项目生成的可执行文件

  此时 CMakeLists.txt 可以这样写

 解释一下:

  • EXECUTABLE_OUTPUT_PATH是cmake系统变量,意思是生成的可执行文件的的目录,我这里把他改为bin目录,因此生成的可执行性文件会出现在bin目录中。
find_library(var lib_name lib_path1 lib_path2)
# 函数作用:查找库,并把库的绝对路径和名称存储到第一个参数里
# 参数var:用于存储查找到的库
# 参数lib_name:想要查找的库的名称,默认是查找动态库,想要指定查找动态库或静态库
#       可以加后缀,例如 funcname.so 或 funcname.a 
# 参数lib_path:想要从哪个路径下查找库,可以指定多个路径
target_link_libraries(target lib_name)
# 函数作用:把库lib_name链接到target可执行文件中

2.8 CMake其他功能

添加编译选项

有时编译程序时想添加一些编译选项,如-Wall,-std=c++11等,可以使用add_compile_options来进行操作,例如:

学习: CMake 保姆级教程(上) | 爱编程的大丙

转载:cmake使用详细教程(日常使用这一篇就足够了)_cmake教程-CSDN博客

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值