Linux下CMake入门

news/2024/10/20 6:20:41/

CMake的基础知识

  1. 什么是 CMake
  • CMake 是一个跨平台的构建工具,主要用于管理构建过程。CMake 不直接构建项目,而是生成特定平台上的构建系统(如 Unix 下的 Makefile,Windows 下的 Visual Studio 工程),然后通过这些构建系统来进行编译和链接
  1. CMake 的基本流程
    CMake 的工作流程通常如下:

    1. 编写 CMakeLists.txt 文件来定义项目的构建逻辑。
    2. 使用 cmake 命令生成构建文件(如 Makefile)。
    3. 运行生成的构建系统(如 make)来构建项目。
  2. 例子如下

    //一个简单的 C++ 项目,文件结构如下
    project/
    ├── CMakeLists.txt
    ├── main.cpp//main.cpp
    #include <iostream>int main() {std::cout << "Hello, CMake!" << std::endl;return 0;
    }//CMakeLists.txt
    cmake_minimum_required(VERSION 3.10)  # 设置最低 CMake 版本要求
    project(HelloCMake)                    # 定义项目名称set(CMAKE_CXX_STANDARD 11)             # 设置 C++ 标准
    add_executable(hello main.cpp)         # 定义生成的可执行文件
    • 构建步骤
      1. 创建构建目录并进入
    mkdir build
    cd build
     2. 运行 CMake 生成构建文件
    
    cmake ..
    # .. 指的是上一级目录(也称为父目录)。在运行 cmake 命令时,指定的是包含 CMakeLists.txt 文件的路径。
    
     3. 构建项目
    
    make
     4. 运行生成的可执行文件
    
    ./hello
    

    在这里插入图片描述

CMake 的基本指令

  1. cmake_minimum_required
# 指定 CMake 运行所需的最低版本,例如
cmake_minimum_required(VERSION 3.10)
  1. project
# 定义项目的名称和相关的语言
project(MyProject LANGUAGES C CXX)
  1. set
# 设置变量值。常用于设置编译选项、路径等
set(CMAKE_CXX_STANDARD 11)  # 设置 C++ 标准为 C++11
set(SOURCE_FILES main.cpp file1.cpp file2.cpp)  # 定义源文件列表
  1. add_executable
# 定义要生成的可执行文件。你需要给出目标名称和源文件列表
定义要生成的可执行文件。你需要给出目标名称和源文件列表
  1. add_library
# 用于生成静态或动态库
# 生成静态库
add_library(mylib STATIC file1.cpp file2.cpp)# 生成动态库
add_library(mylib SHARED file1.cpp file2.cpp)
  1. target_link_libraries
# 用于链接外部库或内部库
target_link_libraries(my_program mylib)  # 链接自定义库
target_link_libraries(my_program PUBLIC pthread)  # 链接系统库
  1. include_directories
# 为项目指定头文件目录
include_directories(/path/to/headers)

管理多个源文件和目录

举例说明

  1. 假设项目结构如下
project/
├── CMakeLists.txt
├── src/
│   ├── CMakeLists.txt
│   ├── main.cpp
│   ├── file1.cpp
│   ├── file2.cpp
└── include/└── file1.h└── file2.h
  1. 顶层 CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(MyProject)# 设置 C++ 标准
set(CMAKE_CXX_STANDARD 11)# 添加 include 目录
include_directories(${PROJECT_SOURCE_DIR}/include)# 递归处理 src 目录
add_subdirectory(src)
  1. src/CMakeLists.txt
# 定义源文件列表
set(SOURCE_FILES main.cpp file1.cpp file2.cpp)# 生成可执行文件
add_executable(my_program ${SOURCE_FILES})
  1. 构建项目
mkdir build
cd build
cmake ..
make

跨平台和编译器支持

CMake 的一个优势在于它能够支持多平台和多编译器。你可以通过 CMake 生成 Visual Studio、Xcode 工程文件,或者为其他平台生成 Makefile。

  1. 生成不同平台的构建文件
  • G关键字
# 生成 Unix Makefile(默认)
cmake ..# 生成 Visual Studio 工程
cmake -G "Visual Studio 16 2019" ..# 生成 Xcode 工程
cmake -G "Xcode" ..
  1. 支持多编译器(D)
# 可以通过 CMAKE_C_COMPILER 和 CMAKE_CXX_COMPILER 变量指定编译器
cmake -D CMAKE_C_COMPILER=gcc -D CMAKE_CXX_COMPILER=g++ ..

http://www.ppmy.cn/news/1538736.html

相关文章

FireFox简单设置设置

文章目录 一 设置不显示标签页1原来的样子2新的样子3操作方法 二 设置竖直标签页栏1 效果图2 设置方法 三 设置firefox不提醒更新 一 设置不显示标签页 1原来的样子 2新的样子 3操作方法 地址栏输入 about:config搜索icon,双击选项列表中browserchrome.site icons的值&#…

百度搜索引擎(SEO)优化师的未来将何去何从?

百度搜索引擎&#xff08;SEO&#xff09;优化师的未来将何去何从&#xff1f; 作为一名SEO专家&#xff08;林汉文&#xff09;&#xff0c;在过去的三年里&#xff0c;我深感自己与快速变化的百度SEO圈子逐渐脱节。然而&#xff0c;在最近重拾旧业&#xff0c;重新审视SEO特…

postman变量,断言,参数化

环境变量 1.创建环境变量 正式环境是错误的&#xff0c;方便验证环境变化 2.在请求中添加变量 3.运行前选择环境变量 全局变量 能够在任何接口访问的变量 console中打印日志 console.log(responseBody);//将数据解析为json格式 var data JSON.parse(responseBody); conso…

软件供应链十年:探索开源的增长、风险和未来

回顾软件供应链状况报告的 10 年既是一个里程碑&#xff0c;也是一次行动号召。在过去十年中&#xff0c;开源消费改变了软件开发的世界。我们看到了前所未有的创新&#xff0c;但也出现了新的挑战&#xff0c;特别是在管理软件供应链的安全性和完整性方面。 在 Sonatype&…

DHASH感知算法计算视频相邻帧的相似度

一个朋友想用python来读取视频帧&#xff0c;根据帧和帧之间相似度判断剪辑痕迹&#xff1b;但是最后发现并没什么用…… 原理就是遍历地读取图像相邻帧&#xff0c;将图像相邻帧前处理后&#xff0c;缩小什么的&#xff0c;计算d_hash,然后计算其汉明距离&#xff0c;然后把汉…

动手学深度学习60 机器翻译与数据集

1. 机器翻译与数据集 import os import torch from d2l import torch as d2l#save d2l.DATA_HUB[fra-eng] (d2l.DATA_URL fra-eng.zip,94646ad1522d915e7b0f9296181140edcf86a4f5)#save def read_data_nmt():"""载入“英语&#xff0d;法语”数据集"&qu…

38 Spring

38 Spring 参考资料 Spring-全面详解&#xff08;学习总结&#xff09; 基本概念 Spring理念 : 使现有技术更加实用 . 本身就是一个大杂烩 , 整合现有的框架技术。 Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器&#xff08;框架&#xff09;。 IOC本质 IOC全…

压力测试指南-云环境中的压力测试实践

云环境中的压力测试实践 1. 云环境对压力测试的影响​ 在数字化转型的浪潮中&#xff0c;云环境已成为软件部署与测试的首选。它不仅提供了无限的可扩展性&#xff0c;还极大地改变了我们进行压力测试的方式。传统本地环境中&#xff0c;硬件资源的限制常导致无法模拟真实世界…