CMake编译 c++源码入门教程

news2024/11/15 21:56:24

CMake

  • 随着工程的越来越大,且需要跨平台的应用,Make工具也会相对麻烦。因此,2000年,由Kitware公司开发。CMake是一种跨平台的构建系统,它使用一种声明式的构建语言,允许用户通过简单的配置文件来定义项目的结构和编译设置。这一工具的出现极大地简化了项目的构建过程,它可以生成Makefile或其他构建文件,从而自动化处理编译、链接等复杂任务。CMake支持多种编程语言,如C、C++、Fortran等,并可以轻松地实现跨平台构建,为开发者提供了极大的便利。
  • CMake是一个开源的、跨平台的自动化构建系统,它用于控制编译过程,通过使用简单的控制文件和命令来生成标准的构建文件,如Makefile或项目文件,进而控制编译过程。CMake不直接构建项目,而是根据CMakeLists.txt文件(CMake的配置文件)和编译器的信息生成构建文件,然后由Make工具或其他构建工具来执行实际的构建过程。
  • CMake的主要目标是使软件的构建过程更加自动化和跨平台,开发者只需要编写CMakeLists.txt文件来描述项目的构建规则,CMake就可以根据这个文件生成相应的构建文件,从而在不同的平台上使用不同的编译器进行构建。
  • CMake网址:https://cmake.org/
    在这里插入图片描述

CMakeLists.txt

CMakeLists.txt是CMake的配置文件,用于描述项目的结构、构建规则和依赖关系。该文件位于项目的根目录下,使用CMake语法来定义项目的构建过程。

CMakeLists.txt里常见内容和指令:

  • cmake_minimum_required:指定CMake的最低版本要求。
cmake_minimum_required(VERSION <version>)
  • project:设置项目的名称和版本。
project(<project_name> VERSION <version>)
  • add_executable:定义可执行文件的构建规则。
add_executable(<executable_name> <source_files>)
  • add_library:定义库文件的构建规则。
add_library(<library_name> <library_type> <source_files>)
  • target_link_libraries:指定目标文件(可执行文件或库文件)所依赖的其他库。
target_link_libraries(<target> <library1> <library2> ...)
  • include_directories:指定头文件的搜索路径。
include_directories(<directory1> <directory2> ...)
  • find_package:查找和导入外部依赖库。
find_package(<package_name> REQUIRED)
  • add_subdirectory:包含子目录的CMakeLists.txt文件。
add_subdirectory(<subdirectory>)
  • set:设置变量。
set(<variable> <value>)
  • if和endif:条件语句,用于根据条件执行特定的操作。
if(<condition>)
  # Actions when condition is true
endif()
  • foreach和endforeach:迭代语句,用于遍历列表并执行操作。
foreach(<variable> IN <list>)
  # Actions using ${variable}
endforeach()

CMake编译 c++实例

编写简单 c++源码

#include <iostream>

int main() {
    std::cout << "Hello, CMake!" << std::endl;
    return 0;
}

编写c++的 CMakeLists 文件

cmake_minimum_required(VERSION 3.0)
project(MyProject)

# 将源文件添加到可执行文件
add_executable(MyExecutable src/main.cpp)

编译过程

  • 创建 cmake文件夹,文件夹内部结构目录:
├── CMakeLists.txt
├── build
└── src
	└── main.cpp
  • cd build 目录下,输入 cmake ..命令,输出如下:
cmake ..
CMake Deprecation Warning at CMakeLists.txt:1 (cmake_minimum_required):
  Compatibility with CMake < 3.5 will be removed from a future version of
  CMake.

  Update the VERSION argument <min> value or use a ...<max> suffix to tell
  CMake that the project does not need compatibility with older versions.


-- The C compiler identification is AppleClang 15.0.0.15000309
-- The CXX compiler identification is AppleClang 15.0.0.15000309
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/cc - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++ - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done (0.6s)
-- Generating done (0.0s)
-- Build files have been written to: /Users/admin/downloads/cmake/build
  • 此时在 build 目录下输入 tree 命令查看生成的文件目录如下:
.
├── CMakeCache.txt
├── CMakeFiles
│   ├── 3.27.1
│   │   ├── CMakeCCompiler.cmake
│   │   ├── CMakeCXXCompiler.cmake
│   │   ├── CMakeDetermineCompilerABI_C.bin
│   │   ├── CMakeDetermineCompilerABI_CXX.bin
│   │   ├── CMakeSystem.cmake
│   │   ├── CompilerIdC
│   │   │   ├── CMakeCCompilerId.c
│   │   │   ├── CMakeCCompilerId.o
│   │   │   └── tmp
│   │   └── CompilerIdCXX
│   │       ├── CMakeCXXCompilerId.cpp
│   │       ├── CMakeCXXCompilerId.o
│   │       └── tmp
│   ├── CMakeConfigureLog.yaml
│   ├── CMakeDirectoryInformation.cmake
│   ├── CMakeScratch
│   ├── Makefile.cmake
│   ├── Makefile2
│   ├── MyExecutable.dir
│   │   ├── DependInfo.cmake
│   │   ├── build.make
│   │   ├── cmake_clean.cmake
│   │   ├── compiler_depend.make
│   │   ├── compiler_depend.ts
│   │   ├── depend.make
│   │   ├── flags.make
│   │   ├── link.txt
│   │   ├── progress.make
│   │   └── src
│   ├── TargetDirectories.txt
│   ├── cmake.check_cache
│   ├── pkgRedirects
│   └── progress.marks
├── Makefile
└── cmake_install.cmake
  • build 目录下输入 make 命令,进行编译 c++的过程:
(base) admin@bogon build % make
[ 50%] Building CXX object CMakeFiles/MyExecutable.dir/src/main.cpp.o
[100%] Linking CXX executable MyExecutable
[100%] Built target MyExecutable
  • 此时发现在 build 里已经编译出MyExecutable的可执行文件,在 build 目录输入 tree 命令:
.
├── CMakeCache.txt
├── CMakeFiles
│   ├── 3.27.1
│   │   ├── CMakeCCompiler.cmake
│   │   ├── CMakeCXXCompiler.cmake
│   │   ├── CMakeDetermineCompilerABI_C.bin
│   │   ├── CMakeDetermineCompilerABI_CXX.bin
│   │   ├── CMakeSystem.cmake
│   │   ├── CompilerIdC
│   │   │   ├── CMakeCCompilerId.c
│   │   │   ├── CMakeCCompilerId.o
│   │   │   └── tmp
│   │   └── CompilerIdCXX
│   │       ├── CMakeCXXCompilerId.cpp
│   │       ├── CMakeCXXCompilerId.o
│   │       └── tmp
│   ├── CMakeConfigureLog.yaml
│   ├── CMakeDirectoryInformation.cmake
│   ├── CMakeScratch
│   ├── Makefile.cmake
│   ├── Makefile2
│   ├── MyExecutable.dir
│   │   ├── DependInfo.cmake
│   │   ├── build.make
│   │   ├── cmake_clean.cmake
│   │   ├── compiler_depend.make
│   │   ├── compiler_depend.ts
│   │   ├── depend.make
│   │   ├── flags.make
│   │   ├── link.txt
│   │   ├── progress.make
│   │   └── src
│   │       ├── main.cpp.o
│   │       └── main.cpp.o.d
│   ├── TargetDirectories.txt
│   ├── cmake.check_cache
│   ├── pkgRedirects
│   └── progress.marks
├── Makefile
├── MyExecutable
└── cmake_install.cmake

运行

  • 在 build 目录下输入./MyExecutable,输出结果如下:

Hello, CMake!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1526946.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Andriod的连锁药店管理系统(源码|论文)

一、系统架构 前端&#xff1a;vue | uni-app 后端&#xff1a;spring | springmvc | mybatis 环境&#xff1a;jdk1.8 | mysql | maven | node 二、代码及数据库 三、功能介绍 01. 登录页 02. 管理后台-首页 03. 管理后台-个人中心-修改密码 04. 管理后台-个人中心-个…

嵌入式Linux 内核的内存管理方法

内存管理的主要工作就是对物理内存进行组织,然后对物理内存的分配和回收。但是Linux引入了虚拟地址的概念。 虚拟地址的作用 如果用户进程直接操作物理地址会有以下的坏处: 1、 用户进程可以直接操作内核对应的内存,破坏内核运行。 2、 用户进程也会破坏其他进程的运行 …

【Unity】CatlikeCoding SRP

Unity 自定义渲染管线 提示&#xff1a;基于CatlikeCoding SRP系列教程学习 学习链接&#xff1a;SRP 个人测试: Demo 相关记录以后有时间再更&#xff1a;

计算机考研|北航北理北邮怎么选?

北航985&#xff0c;北理985&#xff0c;北邮211 虽然北邮事211&#xff0c;但是北邮的计算机实力一点也不弱&#xff0c;学科评级&#xff0c;计算机是A 北航计算机评级也是A&#xff0c;北理的计算机评级是A- 所以&#xff0c;这三所学校在实力上来说&#xff0c;真的大差…

大模型知识积累——幻觉

什么是大模型幻觉 在大语言模型的文本生成场景下&#xff0c;幻觉是指一本正经的胡说八道。逻辑连贯的自然表述中&#xff0c;有理论或者事实错误&#xff0c;捏造事实等问题。 幻觉问题的危害 LLM幻觉可能产生传播错误知识的后果。对于医疗应用中结果安全和可信AI尤为重要&a…

研究揭示OpenAI GPT-3.5-Turbo模型参数量可能只有7B

加利福尼亚州&#xff0c;洛杉矶 - 一项由南加州大学计算机科学系的研究人员进行的新研究&#xff0c;通过创新的数学方法&#xff0c;对OpenAI公司的最新语言模型GPT-3.5-Turbo的内部结构进行了深入分析。研究团队通过一系列精心设计的“暴力提问”实验&#xff0c;成功地估计…

【全网最详细】ComfyUI下,Insightface安装指南-聚梦小课堂

&#x1f96e;背景 ComfyUI下使用IP-adapter下的faceID模型的时候&#xff0c;大家可能会遇到如下错误&#xff1a; Error occurred when executing InsightFaceLoader: No module named insightface File "F:\ComfyUI-aki\execution.py", line 151, in recursive_…

【四】常用数据层技术高可用方案1

常用数据层技术高可用方案 简介 做架构设计我们都要面临系统的三高问题&#xff0c;系统的三高是指高并发、高性能、高可用&#xff0c;这些是系统架构设计中的重要指标。 高并发是指系统能够同时处理大量请求的能力。每次设计架构我们都需要根据业务体量来估算系统需要具备的并…

可视化场景(5):生产监控,比摄像头好用多了。

hello&#xff0c;我是贝格前端工场&#xff0c;本期分享可视化大屏在生产监控场景的应用&#xff0c;如需要定制&#xff0c;可以与我们联络&#xff0c;开始了。 实时监控 可视化大屏可以实时展示生产线上的各种关键指标和数据&#xff0c;如生产速度、设备状态、产量、质量…

PHP反序列化--引用

一、引用的理解&#xff1a; 引用就是给予一个变量一个恒定的别名。 int a 10; int b &a; a 20; cout<<a<<b<<endl; 输出结果 : a20、b20 二、靶场复现&#xff1a; <?php highlight_file(__FILE__); error_reporting(0); include("flag.p…

test测试类-变量学习

test测试类 作用&#xff1a;标记到类上成为测试类&#xff0c;标记到方法上成为测试方法 变量&#xff1a;测试类的变量&#xff0c;在测试类括号中应用 1、invocationCount变量 意思是这个方法应该被调用的次数。 在测试框架中&#xff0c;特别是当使用参数化测试或数据驱动…

最新WordPress网址导航设计师主题风格网站源码

内容目录 一、详细介绍二、效果展示1.部分代码2.效果图展示 三、学习资料下载 一、详细介绍 最新WordPress精品网址导航主题整站源码WAP端修复tab标签ajax加载模式会显示未审核的网址的bug小屏幕热搜采用水平滚动优化子主题支持添加文章分页 二、效果展示 1.部分代码 代码如…

SpringBoot(拦截器+文件上传)

文章目录 1.拦截器1.基本介绍2.应用实例1.去掉Thymeleaf案例中使用session进行权限验证的部分2.编写自定义拦截器 LoginInterceptor.java 实现HandlerInterceptor接口的三个方法3.注册拦截器1.第一种方式 配置类直接实现WebMvcConfigurer接口&#xff0c;重写addInterceptors方…

本地知识库的底层逻辑是什么?为什么企业需要它?

如果我们将企业比作一座繁华的城市&#xff0c;那么信息就像是城市的建筑&#xff0c;知识库则是城市的地图。知识库不仅可以帮我们存储整理和搜寻信息&#xff0c;而且还可以为我们提供信息的结构以便我们能够更好地理解和利用这些信息。今天&#xff0c;我们要探讨的就是这个…

一维坐标的移动(bfs)

在一个长度为n的坐标轴上&#xff0c;小S想从A点移动B点。 他的移动规则如下&#xff1a; 向前一步&#xff0c;坐标增加1。 向后一步&#xff0c;坐标减少1。 跳跃一步&#xff0c;使得坐标乘2。 小S不能移动到坐标小于0或大于n的位置。 小S想知道从A点移动到B点的最少步数是多…

Layui实现删除及修改后停留在当前页

1、功能概述&#xff1f; 我们在使用layui框架的table显示数据的时候&#xff0c;会经常的使用分页技术&#xff0c;这个我们期望能够期望修改数据能停留在当前页&#xff0c;或者删除数据的时候也能够停留在当前页&#xff0c;这样的用户体验会更好一些&#xff0c;但往往事与…

compile→错误: 不支持发行版本 17

错误: 不支持发行版本 17 具体错误描述如下&#xff1a; [ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.11.0:compile (default-compile) on project big-event: Fatal error compiling: 错误: 不支持发行版本 17 -> [Help 1] [ERROR] …

被 AI 写的游戏代码砸中是什么感觉 | 10 分钟打造你的超级 AI 编码助手

近年来&#xff0c;人工智能得到了迅猛的发展&#xff0c;并在各行各业都得到了广泛应用。尤其是近两年来&#xff0c;AI开发工具逐渐成为开发者们的新宠&#xff0c;其中通义灵码&#xff08;阿里云发布的一款基于通义大模型的 AI 编码助手&#xff09;更是引发了无限可能性的…

后端工程师快速使用axios

文章目录 01.AJAX 概念和 axios 使用模板目标讲解代码解析案例前端后端结果截图 02.URL 查询参数模板目标讲解案例前端后端结果截图 03.常用请求方法和数据提交模板目标讲解案例前端后端结果截图 04.axios 错误处理模板目标讲解案例前端后端结果截图 01.AJAX 概念和 axios 使用…

手写简易操作系统(十)--中断概述

前情提要 我们还是总结一下前面做了什么 1、计算机启动&#xff0c;BIOS将MBR导入到内存&#xff0c;并跳转到相应位置执行 2、MBR将Loader导入到内存&#xff0c;并跳转执行 3、Loader中开启保护模式&#xff0c;准备好GDT表&#xff0c;开启内存分页&#xff0c;从此之后…