[CMake]2高频率命令使用介绍

前言

我们通常希望 工程 + CMakeLists.txt文件生成可执行文件。在Windows下使用通过如下命令行不打开IDE直接生成可执行文件(MSVC 2015)

cmake .. -G "Visual Studio 14 2015 Win64" //指定编译器msvc2015 64位
cmake --build . --config release //指定生成release版本的可执行程序

注意: 不要随意修改参数的位置
参考文章 [cmake] [visual stuido] 编译64位和32位指令
CMake编译Win32(MSVC)程序Release版本

常用的CMake命令

cmake_minimum_required(VERSION 3.18)

这个是必须的版本要求,因为CMake一直在发展中,当CMake遇到不认识的特性时,将直接导致CMake构建失败

project(MyProject)

配置工程的名称,此时可以使用 ${PROJECT_NAME} 值为 MyProject

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

指明要使用C++的标准,还是挺重要的。但是现在都2023年了 visual studio 2015都是默认使用C++11标准

add_compile_definitions(USE_LICENSE)
add_compile_definitions(LICENSE_NUM=10)
add_compile_definitions(LICENSE_INFO="fake license info")

添加宏定义,以及添加有值的宏定义。CMake官方推荐使用,还有个不推荐的就是add_definitions。它有一个显著特点就是 add_definitions(-DFOO) 此时宏定义是FOO ,也就是说它要加一个-D。需要了解因为肯定有很多开源的三方库还是用的这个

add_executable(${PROJECT_NAME}
    ${CMAKE_CURRENT_SOURCE_DIR}/src/main.cpp
)

这个更是重量级了,生成可执行文件,以及生成它所依赖的头文件。${PROJECT_NAME} 一般来说生成可执行文件与工程名称保持一致。${CMAKE_CURRENT_SOURCE_DIR}也是重量级代表当前所在CMakeLists.txt所在的目录

target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)

设置目标的头文件包含目录

message("Name : " ${PROJECT_NAME})

输出信息,通常用于CMake调试。建议如上写法,这样方便智能提示

set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin)

注意这样的写法,在 win + mvsc下会自动扩展一层目录。也就是说如果是Debug模式,此时可执行文件是放在 ${PROJECT_SOURCE_DIR}/bin/Debug

add_library(${PROJECT_NAME} SHARED
    ${CMAKE_CURRENT_SOURCE_DIR}/MyMath.cpp
    ${CMAKE_CURRENT_SOURCE_DIR}/MyMath.h
)

生成库文件,${PROJECT_NAME} 代表名称。SHARED 代表是动态链接库 STATIC 代表是静态链接库

target_link_directories(${PROJECT_NAME}
    PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/bin
)

设置target的链接库文件包含目录

target_link_libraries(${PROJECT_NAME} MyMath)

设置target链接的库文件名称

add_custom_target(COPY_TASK ALL
    ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/MyMath.h ${CMAKE_CURRENT_SOURCE_DIR}/../include 
    COMMENT "copy begin"
)

add_custom_target 的用处: 增加一个没有输出的目标,使得它总是被构建COPY_TASK 就是目标名称。 ALL代表总是被构建否则你需要如 cmake --build . --target COPY_TASK 来显试的去构建这个目标。注意: 这个是在编译前进行的操作。${CMAKE_COMMAND} 代表着 cmake.ext 的目录。-E 代表是运行命令而不是构建 copy 是 cmake 的 command_line。后面则是 command_line 的参数。上述命令在 cmake --build . 将进行文件拷贝。

真实情况模拟

  1. MyProject是一个主程序,而MyTools是一个小工具。我希望在编译MyProject是顺便就能将MyTools编译出来。同时MyTools完全对MyProject没有任何依赖
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/Tools)

此时就会编译 Tools目录 下的CMakeLists.txt

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

假期归来必看!2023年9月份,爆款论文总结,了解最新学术进展!

以下文章来源于AINLPer ,作者ShuYini 十一假期结束了,十月基本上算是过了一半了,小伙伴们收收心准备开始学习工作吧。按照惯例,月初继续带到家盘一下上个月(九月份)的热点论文。本月论文主要分为大模型微调、大模型发布、大模型应…

jmeter线程组

特点:模拟用户,支持多用户操作;可以串行也可以并行 分类: setup线程组:初始化 类似于 unittest中的setupclass 普通线程组:字面意思 teardown线程组:环境恢复,后置处理

泰国Cafe Racer卖到日本去了还限量150台?

GPX推出日本限定 GTM250R Cafe Racer,复古小车卖到日本去了,限量150台,不得不说这台小车还是挺有味道的。现代的复古风格摩托车也是永远都不会落伍,即使没有什么品牌背书,喜欢这种车型的人,对于配置动力都不…

Uniapp使用wx.getFuzzyLocation()方法,没有超过日调用次数,报错:“此key每日调用已达到上限”

前言: 最近在进行一个小程序项目开发的时候,使用wx.getFuzzyLocation()方法,没有超过日调用次数,但是却出现了报错:“此key每日调用已达到上限”。 解决方案: 打开腾讯位置服务 - 立足生态,连…

学习Go语言Web框架Gee总结--http.Handler(一)

学习Go语言Web框架Gee总结--http.Handler http-base/go.modhttp-base/main.gohttp-base/gee/gee.gohttp-base/gee/go.mod 网站学习来源:Gee 代码目录结构: http-base/go.mod //指定当前模块的名称为 "example" module example//指定当前模…

Python入门学习篇(十七)——封装、继承、多态

1 封装 1.1 理解 属性和方法书写到类里面的操作即为封装 封装可以理解成私有化属性和私有化方法1.2 示例代码 class Person():p_num 0 # 用于统计数量def __init__(self, name, age, sex, job):# __name为私有化属性self.__name nameself.age ageself.sex sexself.job …

一种可扩展的多属性可控文本生成即插即用方法

《An extensible plug-and-play method for multi-aspect controllable text generation》论文解读 文章的主要工作 (1)提出了一种可扩展的即插即用方法,PROMPT GATING,用于多方面可控文本生成,它能够通过简单地连接…

引导和服务

一、Linux操作系统引导过程 1、引导过程总览图 2、引导过程的详细步骤 1.开机自检(BIOS) 服务器主机开机以后,将根据主板BIOS中的设置对CPU、内存、显卡、键盘等设备进行初步检测,检测成功后根据预设的启动顺序移交系统控制权&a…

【MySQL】数据库之主从复制和读写分离

目录 一、什么是读写分离? 二、为甚要读写分离? 三、什么时候需要读写分离? 四、主从复制与读写分离 五、MySQL支持的二进制日志格式 六、主从复制的工作原理 七、MySQL读写分离的原理 八、MySQL读写分离的方式有哪些 九、实验一&am…

Windows 7 虚拟机的安装以及解决安装VMVMware tools问题

1.Windows 7 虚拟机的安装以及解决安装VMVMware tools问题 参考:Windows 7 虚拟机的安装以及解决安装VMVMware tools问题 注意:下载官方补丁:Microsoft Update Catalog在智慧联想浏览器中打不开,要在火狐中才能打开下载。 2.win7如…

Navicat(数据库可视化软件)安装教程以及连接MYSQL

Navicat安装教程以及连接MYSQL Navicat(数据库可视化软件)安装流程安装MySQLnavicat连接mysql数据库 Navicat(数据库可视化软件) Navicat 是一款专门为 MySQL 设计的可视化数据库 GUI 管理工具,我们可以在自己的计算机…

【HarmonyOS开发】共享包HAR和HSP的创建和使用以及三方库的发布

OpenHarmony提供了两种共享包,HAR(Harmony Archive)静态共享包,和HSP(Harmony Shared Package)动态共享包。 HAR与HSP都是为了实现代码和资源的共享,都可以包含代码、C库、资源和配置文件&…

Windows可以ping通ubuntu,但ubuntu无法ping通windows

使用了NAT网卡和桥接网卡,电脑连了WiFi,桥接网卡桥接到WLAN上,Windows可以ping通Ubuntu但反过来不行! 1.可能是防火墙的问题,按照如下设置,无果 考虑是不是使用了两个网卡冲突了,取消NAT的链接 …

【Mybatis】Mybatis如何防止sql注入

🍎个人博客:个人主页 🏆个人专栏: Mybatis ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 1、使用参数化的 SQL 语句: 2、使用动态 SQL 标签: 3、禁止拼接 SQL: 4、限制参数类…

SkyWalking 快速入门

SkyWalking 是一个基于 Java 开发的分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。 一、SkyWalking 简介 SkyWalking 是观察性分析平台和应用性能管理系统。 提供分布式追踪、服务网格…

SpringBoot的基础配置

问题导入 入门案例中没有引入spring-webmvc等依赖包,没有配置Tomcat服务器,为什么能正常启动?我们没有配置端口号,为什么端口是8080? 起步依赖 starter SpringBoot中常见项目名称,定义了当前项目使用的所…

AUTOSAR软件架构描述文档,AUTOSAR_EXP_LayeredSoftwareArchitecture

AUTOSAR软件架构描述文档,我们常见的经典的CP架构及OS双核等架构描述 下载链接:https://www.autosar.org/fileadmin/standards/R21-11/CP/AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf

71.乐理基础-打拍子-三连音的变体

上一个内容:70.乐理基础-打拍子-三连音-CSDN博客 首先常见的三连音如下图的样子: 三连音的变体遇到的次数并不会很多,可以不用看不用懂 三连音的变体: 1.三连音节奏型依然有可能藏有休止符,如下图 2.在这之前的三连音…

Java LinkedList解密

一、LinkedList最底层的原理 LinkedList其实底层是链表: 当初始化的时候,会将链表这个节点的值、prev指针和next指针初始化。 二、LinkedList初始化 无参构造并没有做什么。有参构造会先调用无参构造,然后调用addAll方法将链表的节点都初始化…

基于花授粉算法优化的Elman神经网络数据预测 - 附代码

基于花授粉算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于花授粉算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于花授粉优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#x…