首页 > 其他分享 >快速入门CMake

快速入门CMake

时间:2023-11-23 19:44:55浏览次数:41  
标签:executable cmake 入门 源文件 add cpp CMake main 快速

一、CMake简介

​ 使用简单方便,可以跨平台,构建项目编译环境。尤其比直接写Makefile简单(在构建大型工程编译

时,需要写大量的文件依赖关系),可以通过简单的CMake生成负责的Makefile文件。

二、CMake安装

​ ubuntu上直接执行 sudo apt install cmake 安装完成,可以通过cmake -version查看其版本:

image-20231123191157461

三、CMake的简单使用

​ cmake命令会执行目录下的CMakeLists.txt配置文件里面的配置项,一个基本的CMakeLists.txt的配置

文件内容如下:

cmake_minimum_required (VERSION 2.8) #要求cmake最低的版本号
project (demo) # 定义当前工程名字
set(CMAKE_BUILD_TYPE "Debug")#设置debug模式,如果没有这一行将不能调试设断点
set(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} -g)#加入gdb调试设置
add_executable(main main.c)
#进入子目录下执行 CMakeLists.txt文件 这里的lib和tests里面都有可编译的代码文件
add_subdirectory(lib)
add_subdirectory(tests)

例一

​ 生成一个main.cpp源文件,输出"hello world",然后在同级目录创建一个CMakeLists.txt文件,内容

如下:

cmake_minimum_required (VERSION 3.0) #要求cmake最低的版本号
project (demo) # 定义当前工程名字
set(CMAKE_BUILD_TYPE "Debug")#设置debug模式,如果没有这一行将不能调试设断点
add_executable(main main.cpp)

​ 保存退出,执行cmake .命令,输出如下:

image-20231123192218482

​ 可以看到它其实是makefile的一层封装(我认为)因此还是会生成makefile文件,因此在此文件目录下执行makefile即可生成可执行文件main,执行如下:

image-20231123192458141

​ 因为生成了makefile文件,因此一切makefile的命令都是可以用的。

例二

​ 如果需要编译的有多个源文件,可以都添加到add_executable(main main.cpp test.cpp)列表当中,

但是如果源文件太多,一个个添加到add_executable的源文件列表中,就太麻烦了,此时可以用

aux_source_directory(dir var)来定义源文件列表,使用如下:

cmake_minimum_required (VERSION 2.8)
project (demo)
aux_source_directory(. SRC_LIST) # 定义变量,存储当前目录下的所有源文件
add_executable(main ${SRC_LIST})

​ aux_source_directory()也存在弊端,它会把指定目录下的所有源文件都加进来,可能会加入一些我们

不需要的文件,此时我们可以使用set命令去新建变量来存放需要的源文件,如下

cmake_minimum_required (VERSION 2.8)
project (demo)
set( SRC_LIST
./main.cpp
./test.cpp)
add_executable(main ${SRC_LIST})

例三

​ 一个完整的开源项目应该是如下的结构

​ -bin 存放最终的可执行文件

​ -build 存放编译中间文件

​ -include 头文件

​ --sum.h

	--minor.h

​ -src 源代码文件

	--sum.cpp

	--minor.cpp

​ main.cpp

​ -CMakeLists.txt


CMakeLists.txt如下:

cmake_minimum_required (VERSION 2.8)
project (math)
# 设置cmake的全局变量
set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
#添加头文件路径,相当于makefile里面的-I
include_directories(${PROJECT_SOURCE_DIR}/include)
aux_source_directory (src SRC_LIST)
add_executable (main main.cpp ${SRC_LIST})

​ 然后在build目录里面执行cmake .. 命令,这样所有的编译中间文件都会在build目录下,最终的可执行

文件会在bin目录里面

​ 后面还有静态库与动态库的制作和使用cmake链接,这里不在赘述,需要的自行百度。

标签:executable,cmake,入门,源文件,add,cpp,CMake,main,快速
From: https://www.cnblogs.com/dwinternet/p/17852331.html

相关文章

  • Handler 源码解析,从入门到几乎入门
    AndroidHandler源码解析在Android中,Handler是一种强大的机制,用于在不同的线程之间进行通信。通过Handler,你可以轻松地将任务从一个线程发送到另一个线程,通常用于在后台线程执行任务后更新UI。同时handler机制也是Android主线程运行的原理,了解了主线程的运行原理也就可以知道l......
  • FPGA入门笔记006——状态机设计实例
    状态分析:状态1:等待“H”的到来,如果检测到“H”,进入状态2,检测“e”,否则一直等待“H”;状态2:检测当前字符是否是“e”,如果是“e”,跳转到状态3,检测“l”,否则,回到状态1,重新等待“H”;状态3:检测当前字符是否是“l”,如果是“l”,跳转到状态4,检测“l”,否则,回到状态1,重新等待“H”;状态4:......
  • 快速生成一组环形数据
      sklearn是一个开源的机器学习库,支持不同种类的机器学习算法,并且提供了许多质量良好的数据集。假如我们想要得到一组环形数据集,借助sklearn的包很轻易就可以实现,不过换个角度思考,我们自己动手是否也可以生成一组数据,使之在散点图上环状分布;借助C++的random头文件以及一点高中数......
  • 刘金玉QT学习笔记:6-sqlite简易入门+QT结合使用
    //第一篇,测试一下1.Sqlite-linux自带-轻量级-关系型数据库2.安装-进入官网后点击Downloads-下载下图的两个zip,解压后把里面的文件放到C盘下自创一个sqlite的文件夹3.通过命令行使用sqlite3.exe来使用数据库-配环境变量作用:不用进入路径位置就可以打开(sqlite)4.基本......
  • TCP/IP,C/S,B/S网络编程入门随笔
    前言  海投简历的时候,很多岗位都要求你掌握HTTP交互和了解TCP/IP协议,以及一些网络编程的要求,趁实习的空隙补一补C/S和B/SC/S(Client/Server)结构,也就是客户端和服务器结构  也可以叫二层C/S结构,即客户机,服务机这两层结构  例如QQ、WeChat以及游戏客户端(例如steam)这些,可......
  • flink入门程序
    flink入门程序生成项目mvnarchetype:generate-DarchetypeGroupId=org.apache.flink-DarchetypeArtifactId=flink-quickstart-java-DarchetypeVersion=1.16.4wordcount入门教程socket进程收集数据#terminal运行nc-lk9999javaflink处理importorg.apa......
  • 数据分析从入门到高级,10分钟帮你构建知识体系!
    数据分析是一种通过收集、整理、解释和可视化数据来获得洞察力和做出决策的过程。它在各行各业都起着至关重要的作用,包括市场营销、金融、医疗保健、人力资源等领域。在本文中,我将为你介绍数据分析的入门知识,并逐步向你介绍一些高级概念和技巧。入门知识1.数据分析的基本概念......
  • .NET8:快速集成Rapid.NET三维控件
    .NET8正式版本发布了,AnyCADRapid.NET针对.NET8进行了升级和优化。本文以WPF项目为例介绍在.NET8中使用AnyCADRapid.NET三维控件。1从.NET6升级若之前使用NET6升级到.NET8,升级过程非常简单,升级到AnyCADRapid.NET最新版本后,仅需要更改以下两处:(1).csproj文件<TargetFramewor......
  • 快速掌握keepalived
    Keepalived是一个基于VRRP(虚拟路由冗余协议)的开源软件,用于在Linux系统上实现高可用性和负载均衡。它的主要功能是通过多台服务器之间的协作,确保在其中一台服务器发生故障时,另一台服务器可以接管其功能,并继续提供服务,从而实现系统的高可用性。常用功能:虚拟IP(VirtualIP):Keepali......
  • Java开发者的Python快速进修指南:迭代器(Iterator)与生成器
    这一篇内容可能相对较少,但是迭代器在Java中是有用处的。因此,我想介绍一下Python中迭代器的使用方法。除了写法简单之外,Python的迭代器还有一个最大的不同之处,就是无法直接判断是否还有下一个元素。我们只能通过捕获异常或使用for循环来退出迭代,这点让我感到十分惊讶。可迭代对象......