[C/C++] -- CMake使用

CMake(Cross-platform Make)是一个开源的跨平台构建工具,用于自动生成用于不同操作系统和编译器的构建脚本。它可以简化项目的构建过程,使得开发人员能够更方便地管理代码、依赖项和构建设置。

CMake 使用一个名为 CMakeLists.txt 的配置文件来描述项目的构建过程。在 CMakeLists.txt 文件中,可以指定项目的源代码文件、依赖项以及构建选项等信息。然后,CMake 会根据这些信息生成对应平台的构建脚本(如 Makefile 或 Visual Studio 项目文件),从而完成项目的构建过程。

1.下载安装

  1. Windows

    • 在 CMake 官方网站 上下载 Windows 版本的安装程序。
    • 运行安装程序,按照提示进行安装。
  2. macOS

    • 可以使用 Homebrew 进行安装,命令为 brew install cmake
  3. Linux

    • 在大多数 Linux 发行版的软件仓库中都可以找到 CMake,可以使用系统自带的软件包管理器进行安装,比如:
      • Ubuntu/Debian:sudo apt install cmake
      • Fedora:sudo dnf install cmake
      • CentOS:sudo yum install cmake

2.CMake使用介绍

1. 创建项目目录结构

假设你有以下项目目录结构:

project/|- src/|- main.cpp|- helper.cpp|- include/|- helper.h|- CMakeLists.txt

2. 编辑 CMakeLists.txt 文件

在项目根目录下创建一个 CMakeLists.txt 文件,并添加以下内容:

cmake_minimum_required(VERSION 3.10)project(MyProject)# 添加可执行文件
add_executable(my_executable src/main.cpp src/helper.cpp)# 添加头文件路径
target_include_directories(my_executable PUBLIC include)

3. 生成构建系统

在项目根目录下创建一个 build 目录,进入该目录,并运行以下命令生成构建系统:

cmake ..

4. 构建项目

根据生成的构建系统进行构建操作,比如使用 make 命令(如果是在 Linux/macOS):

make

5. 运行程序

构建成功后,在 build 目录下会生成可执行文件,你可以运行它:

./my_executable

其他常见用法

  • 指定编译选项:
target_compile_options(my_executable PRIVATE -Wall -Wextra)
  • 添加库文件依赖:
find_package(SomeLibrary REQUIRED)
target_link_libraries(my_executable PRIVATE SomeLibrary::SomeLibrary)

3.使用示例

  • 基本的 CMakeLists.txt 配置文件

cmake命令会执行目录下的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)
add_executable(main main.c)
#进入子目录下执行 CMakeLists.txt文件 这里的lib和tests里面都有可编译的代码文件
add_subdirectory(lib)
add_subdirectory(tests)

整个流程

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

1.test.cpp

#include <iostream>using namespace std;
int main()
{cout <<"Hello World!"<< endl;return 0;
}

2.CMakeLists.txt

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

3.执行cmake .命令

产生了CMake的一些中间文件和Makefile文件

Makefile里面实现了clean,所以使用make clean可以清除生成的文件,然后重新编译源码。

4.make编译,生成最终可执行文件

源文件处理

如果需要编译的有多个源文件,可以都添加到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             头文件

        --test.h

-src                    源代码文件

        --test.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目录里面

然后使用make编译

最终生成的文件在bin目录下

静态库和动态库的编译控制

把上面的test源文件直接生成静态库或者动态库,让外部程序进行链接使用,代码结构如下:

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

-build                 存放编译中间文件

-lib                     存放编译生成的库文件

-include             头文件

        --test.h

-src                    源代码文件

        --test.cpp

        --CMakeLists.txt

-test                   测试代码

   --main.cpp

   --CMakeLists.txt

-CMakeLists.txt

最外层的CMakeLists.txt是总控编译:

cmake_minimum_required (VERSION 2.8)
project (cmaketest)
add_subdirectory (test)
add_subdirectory (src)

src里面的源代码要生成静态库或动态库,CMakeLists.txt内容如下:

set (LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/lib)
include_directories (../include) 
# 生成库,动态库是SHARED,静态库是STATIC
add_library (test SHARED test.cpp)
# 修改库的名字
#set_target_properties (test PROPERTIES OUTPUT_NAME "libtest")

test里面的CMakeLists.txt内容如下:

set (EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)
include_directories (../include) # 头文件搜索路径
link_directories (${PROJECT_SOURCE_DIR}/lib) # 库文件搜索路径
add_executable (main main.cpp) # 指定生成的可执行文件
target_link_libraries (main test) # 执行可执行文件需要依赖的库

在build目录下执行cmake ..命令,然后执行make,如下

执行编译生成的可执行文件

查看生成的可执行文件,检验其链接的库有哪些

CMake常用的预定义命令

PROJECT_NAME : 通过 project() 指定项目名称
PROJECT_SOURCE_DIR : 工程的根目录
PROJECT_BINARY_DIR : 执行 cmake 命令的目录
CMAKE_CURRENT_SOURCE_DIR : 当前 CMakeList.txt 文件所在的目录
CMAKE_CURRENT_BINARY_DIR : 编译目录,可使用 add subdirectory 来修改
EXECUTABLE_OUTPUT_PATH : 二进制可执行文件输出位置
LIBRARY_OUTPUT_PATH : 库文件输出位置
BUILD_SHARED_LIBS : 默认的库编译方式 ( shared 或 static ) ,默认为 static
CMAKE_C_FLAGS : 设置 C 编译选项
CMAKE_CXX_FLAGS : 设置 C++ 编译选项
CMAKE_CXX_FLAGS_DEBUG : 设置编译类型 Debug 时的编译选项
CMAKE_CXX_FLAGS_RELEASE : 设置编译类型 Release 时的编译选项
CMAKE_GENERATOR : 编译器名称
CMAKE_COMMAND : CMake 可执行文件本身的全路径
CMAKE_BUILD_TYPE : 工程编译生成的版本, Debug / Release

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

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

相关文章

Ubuntu Desktop - Disks

Ubuntu Desktop - Disks 1. Search your computer -> DisksReferences 1. Search your computer -> Disks ​ References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

探索Nginx:强大的开源Web服务器与反向代理

一、引言 随着互联网的飞速发展&#xff0c;Web服务器在现代技术架构中扮演着至关重要的角色。Nginx&#xff08;发音为“engine x”&#xff09;是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理服务器。Nginx因其卓越的性能、稳定性和灵活性&…

AtCoder Beginner Contest 230 G. GCD Permutation(容斥/莫比乌斯反演 补写法)

题目 给定长为n(n<2e5)的1-n的排列p&#xff0c; 求(i,j)(1<i<j<n)对的数量&#xff0c;满足gcd(i,j)≠1且gcd(pi,pj)≠1 思路来源 官方题解 题解 参考莫比乌斯函数mu&#xff0c;定义一个新函数&#xff0c; 新函数需要满足n1的时候对因子求和为0&#xff0…

Stable Diffusion 模型下载:DreamShaper XL(梦想塑造者 XL)

本文收录于《AI绘画从入门到精通》专栏&#xff0c;专栏总目录&#xff1a;点这里。 文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 DreamShaper 是一个分格多样的大模型&#xff0c;可以生成写实、原画、2.5D 等…

假期作业 9

1.用指针实现strlen、strcpy、strcat、strcmp 代码&#xff1a; #include <stdio.h> #include <string.h> int mystrlen(char *str); int mystrcmp(char *str1,char *str2); char *mystrcat(char *str1,char *str2); char *mystrcpy(char *str1,char *str2); int…

【Linux】基础命令 第二篇

目录 echo 输出重定向:(本质都是写入) 输入重定向cat more 指令 && less指令 head && tail && 管道初步使用 grep&#xff1a;行文本过滤工具&#xff08;文本按行搜索&#xff09; date&#xff1a;获取时间 date 命令用于 显示 或 设置系统的…

【原创 附源码】Flutter安卓及iOS海外登录--Apple登录最详细流程

最近接触了几个海外登录的平台&#xff0c;踩了很多坑&#xff0c;也总结了很多东西&#xff0c;决定记录下来给路过的兄弟坐个参考&#xff0c;也留着以后留着回顾。更新时间为2024年2月12日&#xff0c;后续集成方式可能会有变动&#xff0c;所以目前的集成流程仅供参考&…

【C++ 02】类和对象 1:初识类和对象

文章目录 &#x1f308; Ⅰ 面向对象介绍&#x1f308; Ⅱ 类的引入&#x1f308; Ⅲ 类的定义格式1. 声明和定义不分离2. 声明和定义分离 &#x1f308; Ⅳ 类的访问限定符&#x1f308; Ⅴ 类的作用域&#x1f308; Ⅵ 类的实例化&#x1f308; Ⅶ this 指针 &#x1f308; Ⅰ…

【第二届 Runway短视频创作大赛】——截至日期2024年03月01日

短视频创作大赛 关于AI Fil&#xff4d; Festival竞赛概况参加资格报名期间报名方法 提交要求奖品附录 关于AI Fil&#xff4d; Festival 2022年成立的AIFF是一个融合了最新AI技术于电影制作中的艺术和艺术家节日&#xff0c;让我们得以一窥新创意时代的风采。从众多参赛作品中…

ChatGPT高效提问—prompt实践(视频制作)

ChatGPT高效提问—prompt实践&#xff08;视频制作&#xff09; 1.1 视频制作 ​ 制作视频对于什么都不懂的小白来说非常难。而随着AI技术的发展&#xff0c;这件事变得越来越简单&#xff0c;如今小白也可以轻松上手。如何借助ChatGPT来制作短视频。 ​ 其实方法非常简单&a…

《UE5_C++多人TPS完整教程》学习笔记12 ——《P13 加入游戏会话(Joining The Sessions)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P13 加入游戏会话&#xff08;Joining The Session&#xff09;》 的学习笔记&#xff0c;该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版&#xff0c;UP主&#xff08;也是…

手把手教你开发Python桌面应用-PyQt6图书管理系统-修改密码UI设计实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

Linux第46步_通过“添加自定义菜单”来学习menuconfig图形化配置原理

通过“添加自定义菜单”来学习menuconfig图形化配置原理&#xff0c;将来移植linux要用到。 自定义菜单要求如下: ①、在主界面中添加一个名为“My test menu”&#xff0c;此菜单内部有一个配置项。 ②、配置项为“MY TESTCONFIG”&#xff0c;此配置项处于菜单“My test m…

Spring Security实现权限认证与授权

一、Spring Security Spring Security作为Spring家族的安全框架&#xff0c;在安全方面的两个核心功能是认证&#xff08;Authentication&#xff09;和授权&#xff08;Authorization&#xff09;。 &#xff08;1&#xff09;用户认证指的是&#xff1a;验证某个用户是否为系…

【Java程序设计】【C00265】基于Springboot的地方废物回收机制管理系统(有论文)

基于Springboot的地方废物回收机制管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的地方废物回收机构管理系统 本系统分为管理员功能模块以及员工功能模块。 管理员功能模块&#xff1a;管理员登录系统后…

EXCEL中如何调出“数据分析”的菜单

今天发现&#xff0c;原来WPS还是和EXCEL比&#xff0c;还是少了“数据分析”这个日常基本做统计的菜单&#xff0c;只好用EXCEL了&#xff0c;但奇怪发现我的EXCEL中没发现这个菜单&#xff0c;然后查了下&#xff0c;才发现&#xff0c;要用如下的方法打开&#xff1a; 1&…

Go+:一种简单而强大的编程语言

Go是一种简单而强大的编程语言&#xff0c;它是在Go语言之上构建的&#xff0c;旨在提供更加强大、灵活和易于使用的编程体验。Go与Go语言共享大部分语法和语义&#xff0c;因此Go开发人员可以很快上手Go&#xff0c;同时也可以使用Go来编写更加简洁和高效的代码。在本文中&…

STM32自学☞定时器定时中断案例

timer_interrupt.c文件 /* 初始化函数编写步骤&#xff1a; 1.打开时钟 2.选择时基单元的时钟源&#xff08;内部时钟源&#xff09; 3.配置时基单元 4.NVIC配置 5.启动定时器 */ #include "stm32f10x.h" #include "stm32f10x_tim.h" #include …

CVE-2022-25578 漏洞复现

CVE-2022-25578 路由/admin/admin.php是后台&#xff0c;登录账号和密码默认是admin、tao&#xff0c;选择文件管理。 是否还记得文件上传中的.htaccess配置文件绕过发&#xff0c;在这个文件中加入一句AddType application/x-httpd-php .jpg&#xff0c;将所有jpg文件当作php…

位运算+leetcode(1)

基础 1.基础知识 以下都是针对数字的二进制进行操作 >> 右移操作符<< 左移操作符~ 取反操作符 & 有0就是0&#xff0c;全一才一 | 有一才一 &#xff0c;全0才0^ 相同为0&#xff0c;相异为1 异或( ^ )运算的规律 a ^ 0 a a ^ a 0a ^ b ^ c a ^ (b …