Cmake基础(3)

这篇文章也是一个无三方库的单项目
根据位数和模式分目录存放可执行文件,而且可执行的文件名中包含了位数、模式和编译器。

目录

  • 给出cmake文件
  • 使用mingw的结果
  • cmake中的一些知识点
    • 变量设置与访问
    • cmake中的函数
    • cmake的预定义

本文有以下几个要点

  • cmake中常用路径的宏定义
  • 设置输出路径
  • 根据relsea和平台来确定可执行文件名称

cpp文件还是上一篇文章中的,是一个简单的cout。

给出cmake文件

cmake_minimum_required(VERSION 3.12)
project(MyProject)# 设置可执行文件名
set(EXECUTABLE_NAME "MyExecutable")
# 添加可执行文件
add_executable(${EXECUTABLE_NAME} main.cpp)message(STATUS "^^^^^^Compiler: ${CMAKE_CXX_COMPILER_ID}")# 获取编译器标识符
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")set(COMPILER_NAME "gcc")
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")set(COMPILER_NAME "msvc")
elseif(CMAKE_CXX_COMPILER_ID STREQUAL "Clang")set(COMPILER_NAME "clang")
else()message(FATAL_ERROR "Unsupported compiler")
endif()#获取系统位数
if(${COMPILER_NAME} STREQUAL "msvc" )if(CMAKE_CL_64)set(platform "x64")else(CMAKE_CL_64)set(platform "x64")endif(CMAKE_CL_64) 
else()# sizeof(void*)。这个变量的值通常为 48,表示指针在系统中占用的字节数。在绝大多数情况下,32 位系统中指针大小为 4 字节,64 位系统中指针大小为 8 字节if( CMAKE_SIZEOF_VOID_P EQUAL 8 )set(platform "x64")else()set(platform "x86")endif()
endif()# 设置输出路径 debug和release 分开存放
# lib目录
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/Lib/${platform}/Debug)
# dll目录
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/Lib/${platform}/Debug)
# exe目录
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/Bin/${platform}/Debug)
# PDB目录
set(CMAKE_PDB_OUTPUT_DIRECTORY_DEBUG ${CMAKE_SOURCE_DIR}/PDB/${platform}/Debug)set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/Lib/${platform}/Release)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/Lib/${platform}/Release)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/Bin/${platform}/Release)
set(CMAKE_PDB_OUTPUT_DIRECTORY_RELEASE ${CMAKE_SOURCE_DIR}/PDB/${platform}/Release)# 设置后缀变量
set(CMAKE_DEBUG_POSTFIX _${platform}d_${COMPILER_NAME})
set(CMAKE_RELEASE_POSTFIX _${platform}_${COMPILER_NAME})# 给可执行文件设置后缀名
set_target_properties(${EXECUTABLE_NAME} PROPERTIES DEBUG_POSTFIX ${CMAKE_DEBUG_POSTFIX}RELEASE_POSTFIX ${CMAKE_RELEASE_POSTFIX})# debug模式下保存调试信息
if(${COMPILER_NAME} STREQUAL "msvc" )set_target_properties(${EXECUTABLE_NAME} PROPERTIES  LINK_FLAGS /DEBUG )
endif()

使用mingw的结果

E:\workspace\cmake_demo\simple_demo\bin\x64\Release\MyExecutable_x64_gcc.exe
从结果出看出根据位数和模式分开存放可执行文件,而且可执行的文件名中包含了位数、模式和编译器。
cmake -G “MinGW Makefiles” -DCMAKE_C_FLAGS=-m64 -DCMAKE_BUILD_TYPE=Release …
上篇文章提到了-D还记得吗?-D是设置变量,CMAKE_C_FLAGS和CMAKE_BUILD_TYPE是cmake预定义的,分别表示位数和模式。mingw32-make按照cmake中的来编译,无需额外设置参数。

PS E:\workspace\cmake_demo\simple_demo\build_mingw> cmake -G "MinGW Makefiles" -DCMAKE_C_FLAGS=-m64  -DCMAKE_BUILD_TYPE=Release ..
-- The C compiler identification is GNU 8.1.0
-- The CXX compiler identification is GNU 8.1.0
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: E:/MinGW/mingw64/bin/gcc.exe - 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: E:/MinGW/mingw64/bin/c++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- ^^^^^^Compiler: GNU
-- Configuring done (1.0s)
-- Generating done (0.0s)
-- Build files have been written to: E:/workspace/cmake_demo/simple_demo/build_mingw
PS E:\workspace\cmake_demo\simple_demo\build_mingw> mingw32-make
[ 50%] Building CXX object CMakeFiles/MyExecutable.dir/main.cpp.obj
[100%] Linking CXX executable E:\workspace\cmake_demo\simple_demo\bin\x64\Release\MyExecutable_x64_gcc.exe
[100%] Built target MyExecutable
PS E:\workspace\cmake_demo\simple_demo\build_mingw>

MSVC就不演示了

cmake中的一些知识点

变量设置与访问

使用set 设置变量,使用${} 访问变量

cmake中的函数

add_executable 和set_target_properties 都是cmake的函数,函数名不分大小写。也可以自定义函数,后面的文章会提及。

cmake的预定义

这是cmake预先定义的宏,不分大小写。
CMAKE_SOURCE_DIR:CMakeLists.txt所在的源代码根目录。
CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG:Debug构建时库文件输出目录。
CMAKE_LIBRARY_OUTPUT_DIRECTORY_DEBUG:Debug构建时动态库文件输出目录。
CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG:Debug构建时可执行文件输出目录。
CMAKE_PDB_OUTPUT_DIRECTORY_DEBUG:Debug构建时PDB文件输出目录。
CMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE:Release构建时库文件输出目录。
CMAKE_LIBRARY_OUTPUT_DIRECTORY_RELEASE:Release构建时动态库文件输出目录。
CMAKE_RUNTIME_OUTPUT_DIRECTORY_RELEASE:Release构建时可执行文件输出目录。
CMAKE_PDB_OUTPUT_DIRECTORY_RELEASE:Release构建时PDB文件输出目录。
CMAKE_SIZEOF_VOID_P:指针大小,通常为4或8字节,表示系统是32位还是64位。
CMAKE_CXX_COMPILER_ID:表示C++编译器的标识符,可能的值为 “GNU”、“MSVC”、“Clang” 等。
CMAKE_BUILD_TYPE:用于设置构建类型,例如 “Debug” 或 “Release”。
CMAKE_CL_64:这个变量在MSVC编译器中用于判断是否为64位系统。
CMAKE_DEBUG_POSTFIX:用于指定Debug构建的输出文件名后缀。
CMAKE_RELEASE_POSTFIX:用于指定Release构建的输出文件名后缀

推荐链接
https://cmake.org/cmake/help/latest/#
https://cmake.org/cmake/help/latest/guide/tutorial/index.html

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

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

相关文章

平均数 C语言xdoj66

问题描述 计算n个整数&#xff08;x1,x2,x3...&#xff09;的平均数&#xff0c;结果保留两位小数。 输入说明 第一行为整数n&#xff08;1 < n <100&#xff09;&#xff0c;接下来是n个整数(0 < x1,x2,x3....< 2^31 - 1)。 输出说明 输出这n个整数的…

电商平台的易聊集成:无代码开发,API连接,CRM支持

连接电商与客服&#xff1a;易聊的创新解决方案 在迅速变化的电子商务市场中&#xff0c;企业要想保持竞争力&#xff0c;就必须拥有高效灵活的客服体系。易聊&#xff0c;一家领先的AISaaS服务商&#xff0c;正是基于这一需求&#xff0c;推出了一系列创新产品。它们通过智能…

西南科技大学数据库实验三(SELECT查询操作—简单查询)

一、实验目的 了解查询的概念和方法 掌握select语句在单表查询中的应 掌握select语句在多表查询中的应用 掌握select语句在复杂查询中的实验方法 二、实验任务 输入指令 showvariableslike ‘%char%’ ; 展示字符默认设置 将Variable_name中client、

C/C++ STL提供的关联式容器之map

map 由红黑树实现&#xff0c;其元素都是 “键值/实值” 所形成的一个对组&#xff08;key/value pairs)。 map 主要用于资料一对一映射的情况&#xff0c;map 内部自建一颗红黑树&#xff0c;这颗树具有对数据自动排序的功能&#xff0c;所以在 map 内部所有的数据都是有序的…

Vue2-动态组件案例

1.component介绍 说明&#xff1a; Type: string | ComponentDefinition | ComponentConstructor Explanation: String: 如果你传递一个字符串给 is&#xff0c;它会被视为组件的名称&#xff0c;用于动态地渲染不同类型的组件。这是一个在运行时动态切换组件类型的常见用例。…

【C++】 C++11 新特性探索:decltype 和 auto

▒ 目录 ▒ &#x1f6eb; 问题描述环境 1️⃣ decltype推导变量类型推导函数返回类型 2️⃣ auto自动推导变量类型迭代器和范围循环 3️⃣ decltype 和 auto 同时使用&#x1f6ec; 结论&#x1f4d6; 参考资料 &#x1f6eb; 问题 描述 C11 引入了一些强大的新特性&#xff…

高通平台开发系列讲解(USB篇)Composite USB gadget framework

文章目录 一、Gadget framework二、Composite driver and gadget driver interaction沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇章主要图解高通平台PCIe EP软件架构 一、Gadget framework Composite USB gadget framework 架构如下所示: The composite fram…

什么是容器安全技术

容器可以让开发者将应用与库和其他依赖项打包&#xff0c;提供独立环境来运行其软件服务。将程序和程序运行所依赖的环境&#xff0c;数据库&#xff0c;配置文件都打包好&#xff0c;让其他人打开就可以使用。说起来容器也是一种虚拟化技术&#xff0c;虚拟的是操作系统。容器…

人工智能数据集可视化统计分析工具:快速了解你的数据集

人工智能数据集可视化统计分析工具&#xff1a;快速了解你的数据集 简介特征示例报告安装用法 简介 Lightly Insights&#xff1a;可以轻松获取关于机器学习数据集基本洞察的工具&#xff0c;可以可视化图像数据集的基本统计信息&#xff0c;仅需提供一个包含图像和对象检测标…

C++ Qt开发:标准Dialog对话框组件

Qt 是一个跨平台C图形界面开发库&#xff0c;利用Qt可以快速开发跨平台窗体应用程序&#xff0c;在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置&#xff0c;实现图形化开发极大的方便了开发效率&#xff0c;本章将重点介绍标准对话框QInputDialog、QFileDialog 这两种…

腾讯云Linux云服务器禁Ping设置

腾讯云Linux服务器默认是允许ping包的&#xff0c;但是在一些情况下为了安全考虑起见&#xff0c;我们都会把服务器设置为禁ping的模式。 1、首先检查Linux服务器当前是否禁ping 执行命令&#xff1a; cat /proc/sys/net/ipv4/icmp_echo_ignore_all 备注&#xff1a; 0----代…

Next.js加载异步组件 骨架屏

Next.js 中有两种处理页面加载的方式&#xff0c;一种是 Loading UI 一种是 Streaming。接下来我将介绍这两种的区别&#xff0c;以及实际的业务场景。 当我们进入某个页面时&#xff0c;需要获取页面数据&#xff0c;可能是从数据库读取也有可能是 API 服务&#xff0c;总之这…

代码随想录算法训练营第38天|● 理论基础 ● 509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

509. 斐波那契数 已解答 简单 相关标签 相关企业 斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。也就是&#xff1a; F(0) 0&#xff0c;F(1) 1 F(n) F(n - …

【人工智能革命】:AIGC时代的到来 | 探索AI生成内容的未来

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; IT杂谈 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. AIGC 技术的概述和发展趋势1.1 AIGC 技术的概述1.2 AIGC 技术的发展趋势 二. AIGC 与元宇…

【C语言(十)】

字符函数和字符串函数 一、字符分类函数 C语言中有⼀系列的函数是专门做字符分类的&#xff0c;也就是⼀个字符是属于什么类型的字符的。这些函数的使用都需要包含⼀个头文件是 ctype.h 这些函数的使用方法非常类似&#xff0c;我们就讲解⼀个函数的事情&#xff0c;其他的非…

Python实现多种图像分割方法:基于阈值分割和基于区域分割

Python实现多种图像分割方法&#xff1a;基于阈值分割和基于区域分割 图像分割是图像分析的第一步&#xff0c;是计算机视觉的基础&#xff0c;但也是图像处理中最困难的问题之一。经典的计算机视觉任务&#xff0c;如目标检测、图像识别等都和图像分割相关&#xff0c;图像分…

华为OD机试真题-多段线数据压缩-2023年OD统一考试(C卷)

题目描述: 下图中,每个方块代表一个像素,每个像素用其行号和列号表示。 为简化处理,多段线的走向只能是水平、竖直、斜向45度。 上图中的多段线可以用下面的坐标串表示:(2, 8), (3, 7), (3, 6), (3, 5), (4, 4), (5, 3), (6, 2), (7, 3), (8, 4), (7, 5)。 但可以发现,这…

springboot整合webflux访问openai接口报错

报错信息: org.springframework.web.reactive.function.client.WebClientRequestException: 远程主机强迫关闭了一个现有的连接。; nested exception is java.io.IOException: 远程主机强迫关闭了一个现有的连接。at org.springframework.web.reactive.function.client.Excha…

栈和队列的实现(Java篇)

文章目录 一、栈的概念二、栈的实现2.1压栈(push)2.2出栈(pop)2.3获取栈顶元素(peek)2.4判断栈是否为空(isEmpty)栈的实现测试 三、队列的概念四、队列的实现4.1入队(offer)4.2出队(poll)4.3判断队列是否为空4.4获取对头元素队列的实现测试 五、循环队列5.1入队5.2出队5.3获取队…

MAMOS蓝图: 打造自己的质量工程

针对团队中存在的问题&#xff0c;构造MAMOS蓝图&#xff0c;从而以系统化的方式识别并解决问题。本文将针对减少等待时间这一问题举例说明MAMOS蓝图的组成和使用方式。原文: MAMOS Blueprint: Build your own for Quality at Speed 很难完全摆脱等待时间。 我认为没有必要争论…