CMake笔记

1. CMake语法特性介绍

  1. 基本语法:
    指令(参数1 参数2)
    注:参数使用括号括起来,参数之间使用空格或分号隔开
  2. 指令大小写无关,但是参数和变量大小写相关
set(HELLO hello.cpp) # 定义一个变量名叫HELLO变量的值为hello.cpp

add_executable(hello main.cpp hello.cpp) # 通过main.cpp 和hello.cpp 编译生成 hello可执行程序

ADD_EXECUTABLE(hello main.cpp ${HELLO}) # 作用同上
  1. 变量使用${}进行取值,但是在if语句中,直接使用变量名
if(HELLO) # 正确

if(#{HELLO}) # 不正确
  1. 语句不以分号结尾

2. CMake重要指令

  1. cmake_minimum_required:指定CMake的最小版本支持,一般作为第一条cmake语句
# CMake设置最小支持版本为 2.8 
cmake_minimum_required(VERSION 2.8)
  1. project:定义工程的名称,并指定工程支持的语言
# 指定工程的名称为HELLOWORL
project(HELLOWORLD CXX) # 表示工程名为HELLOWORLD 使用的语言为C++
  1. set:显式定义变量
# 定义变量 SRC 其值为 sayhello.cpp hello.cpp 
set(SRC sayhello.cpp hello.cpp)
  1. add_executable:通过依赖生成可执行程序
# 编译main.cpp 生成main的可执行程序 
add_executable(main main.cpp)
  1. include_directories:向工程添加多个特定的头文件搜索路径,类似于g++编译指令中的 -I(大写i)选项
# 将/usr/lib/mylibfolder 和 ./include添加到工程路径中
include_directories(/usr/lib/mylibfolder ./include)
  1. link_directories:向工程中添加多个特定的库文件搜索路径,类似于g++编译指令的-L选项
# 将/usr/lib/mylibfolder 和 ./lib添加到库文件搜索路径中
link_directories(/usr/lib/mylibfolder ./lib)
  1. add_library:生成库文件(包括动态库和静态库)
# 通过SRC 变量中的文件,生成动态库 
add_library(hello SHARED ${SRC}) # 该语句生成的是动态库
add_library(hello STATIC ${SRC}) # 该语句生成的是静态库
  1. add_compile_options:添加编译参数
# 添加编译参数: -Wall -std=c++11 
add_compile_options(-Wall -std=c++11)# -Wall表示显示所有警告
  1. target_link_libraries:为target添加需要链接的共享库,类似于g++编译中的 -l (小写l)选项
# 将hello 动态库文件链接到可执行程序main中 
target_link_libraries(main hello)

3. CMake常用变量

  1. CMAKE_C_FLAGS:gcc编译选项的值
  2. CMAKE_CXX_FLAGS:g++编译选项的值
# 在CMAKE_CXX_FLAGS编译选项后追加 -std=c++11 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
  1. CMAKE_BUILD_TYPE:编译类型(Debug 、Release)
# 设定编译类型为Debug,调试时需要选择该模式 
set(CMAKE_BUILD_TYPE Debug) 

# 设定编译类型为Release,发布需要选择该模式 
set(CMAKE_BUILD_TYPE Release)

4. CMake编译工程

CMake目录结构:项目主目录中会放一个CMakeLists.txt的文本文档,后期使用cmake指令时,依赖的就是该文档

  1. 包含源文件的子文件夹中包含CMakeLists.txt时,主目录的CMakeLists.txt要通过add_subdirector添加子目录
  2. 包含源文件的子文件夹中不包含CMakeLists.txt文件时,子目录编译规则,体现在主目录中的
    CMakeLists.txt

4.1 两种构建方式

  1. 外部构建(推荐使用):将编译输出的文件与源文件放到不同的目录下,进行编译。此时,编译生成的中间文件不会与工程源文件混淆。
# 外部构建步骤

# 1. 在当前目录下,创建一个build文件,用于存储生成的中间文件
mkdir build

# 2. 进入build文件
cd build

# 3. 编译上一级目录中的CMakeLists.txt,生成Makefile文件以及其他文件
cmake .. # ..表示上一级目录

# 4.执行make命令,生成可执行程序
make
  1. 内部构建(不推荐):内部构建会在主目录下,产生一大堆中间文件,这些中间文件并不是我们最终所需要的,和工程源文件放在一起时,会显得比较杂乱无章。
# 内部构建 

# 在当前目录下,编译主目录中的CMakeLists.txt 文件生成Makefile文件 
cmake . # . 表示当前路径 

# 执行make命令,生成目标文件 
make

5. CMake代码实战

5.1 同一目录下的文件进行编译

  1. 源文件
#include<iostream>

//using namespace std;

int main(){
        std::cout << "hello" << std::endl;
        return 0;
}
  1. CMakeLists.txt文件
# 设置最小版本支持
cmake_minimum_required(VERSION 2.8)

# 项目名称
project(HELLO)

#生成可执行程序,依赖于hello.cpp生成hello可执行程序
add_executable(hello hello.cpp)
  1. 内部构建后的目录(非常乱,不利于项目管理,只有CMakeLists.txthello.cpp是我们想关注的)

在这里插入图片描述

  1. 外部构建后的目录(中间文件全放到build文件夹中)
    在这里插入图片描述

5.2 分文件编译

  1. 头文件swap.h(放在include文件夹下)
#ifndef SWAP_H
#define SWAP_H

#include<iostream>
//声明一个交换类
class My_swap
{
private:
    int a;
    int b;
public:
    //构造函数
    My_swap(int a, int b)
    {
        this->a = a;
        this->b = b;
    }
    //声明交换函数
    void run();
    
    //声明打印函数
    void printInfo();
};

#endif
  1. 源文件swap.cpp(放在src文件夹下)
#include"swap.h"

using std::cout;
using std::endl;

//对交换函数的定义
void My_swap::run()
{
    int tmp = a;
    a = b;
    b = tmp;
}

//对打印函数的定义
void My_swap::printInfo()
{
    cout << "a = " << a << endl;
    cout << "b = " << b << endl;
}
  1. 测试文件main.cpp(放在当前测试文件夹下)
#include"swap.h"

int main(){
        //声明一个交换类对象
        My_swap my_swap(520, 1314);
        
        my_swap.printInfo();//520 1314
        
        my_swap.run();//调用交换函数
        
        my_swap.printInfo();//1314 520
        return 0;
}
  1. 创建工程管理文件CMakeLists.txt
# 指定最小编译版本 
cmake_minimum_required(VERSION 2.8) 

# 执行工程名称 
project(SWAP) 

# 指定头文件路径 就是 g++ 编译器的 -I 选项 
include_directories(include) 

# 生成可执行程序 
add_executable(swap_cmake main.cpp src/swap.cpp)
  1. 创建build文件夹用于存放CMake中间文件,然后使用cmake
# 1. 在当前目录下,创建一个build文件,用于存储生成的中间文件
mkdir build

# 2. 进入build文件
cd build

# 3. 编译上一级目录中的CMakeLists.txt,生成Makefile文件以及其他文件
cmake .. # ..表示上一级目录

# 4.执行make命令,生成可执行程序
make
  1. 外部构建后的目录结构
    在这里插入图片描述
  2. 运行结果
    在这里插入图片描述

相关推荐

  1. cmake学习笔记2

    2024-07-20 16:06:01       40 阅读
  2. Cmake学习笔记3

    2024-07-20 16:06:01       41 阅读
  3. CMake简单笔记

    2024-07-20 16:06:01       37 阅读
  4. CMake 学习笔记(访问Python)

    2024-07-20 16:06:01       28 阅读
  5. Cmake

    2024-07-20 16:06:01       52 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 16:06:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 16:06:01       102 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 16:06:01       83 阅读
  4. Python语言-面向对象

    2024-07-20 16:06:01       92 阅读

热门阅读

  1. 题解:T480715 true

    2024-07-20 16:06:01       26 阅读
  2. 你有多自律就有多自由

    2024-07-20 16:06:01       28 阅读
  3. 2024 暑假友谊赛 2

    2024-07-20 16:06:01       29 阅读
  4. 【CTFWP】ctfshow——web41

    2024-07-20 16:06:01       27 阅读
  5. Scala学习笔记19: 隐式转换和隐式参数

    2024-07-20 16:06:01       29 阅读
  6. Qmi8658a姿态传感器使用心得(2)linux

    2024-07-20 16:06:01       25 阅读
  7. springcloud与dubbo的rpc通信都是分别基于什么实现的

    2024-07-20 16:06:01       24 阅读
  8. AI论文写作软件哪些比较好用?

    2024-07-20 16:06:01       27 阅读
  9. vue-treeselect

    2024-07-20 16:06:01       27 阅读
  10. 反悔贪心

    2024-07-20 16:06:01       26 阅读
  11. 我们的耳穴项目迈进了一大步

    2024-07-20 16:06:01       26 阅读
  12. 【前后端联调】HttpMessageNotReadableException

    2024-07-20 16:06:01       22 阅读
  13. 恒等式结论

    2024-07-20 16:06:01       22 阅读
  14. Https post 请求时绕过证书验证方案

    2024-07-20 16:06:01       26 阅读