CMake笔记:windows下构建一个简单项目

注:本人的临时记录,没什么参看价值,可移步https://cmake.org/cmake/help/v3.21/guide/tutorial/index.html

1. 概述

在这里插入图片描述

用CMake构建一个简单的项目,项目由一个exe以及一个dll组成,项目目录结构如上图,build_MyHello是编译生成的目录。项目包含ALL_BUILD,RUN_TEST,INSTALL,PACKAGE,如下图:
在这里插入图片描述

2. 详细步骤

  1. MyHello/CMakeLists.txt
    add_subdirectory:将src目录加入编译,CMake会去src目录下找CMakeLists.txt。我在MyHello/src/CMakeLists.txt中使用了add_executable来编译一个exe。当让也可以直接在以下CMakeLists.txt中直接写add_executable,只是处理好路径即可,但在子目录中各自管理自己的CMakeLists.txt会更清晰些。

    cmake_minimum_required(VERSION 3.21)
    PROJECT(Hello VERSION 2.0)# 测试打印信息功能
    MESSAGE(STATUS "hello, this is cmake message")
    MESSAGE(STATUS ${PROJECT_BINARY_DIR})
    MESSAGE(STATUS ${Hello_VERSION_MAJOR})# 将src目录加入到编译中
    add_subdirectory(src)# 加入测试
    enable_testing()
    add_test(NAME Runs COMMAND MyHelloExe )
    add_test(NAME Usage COMMAND MyHelloExe )# 加入打包功能
    include(InstallRequiredSystemLibraries)
    set(CPACK_PACKAGE_VERSION_MAJOR "${Hello_VERSION_MAJOR}")
    set(CPACK_PACKAGE_VERSION_MINOR "${Hello_VERSION_MINOR}")
    include(CPack)
  2. MyHello/src/CMakeLists.txt

    # 打印信息
    MESSAGE( STATUS ${PROJECT_SOURCE_DIR} )# set(CMAKE_CXX_STANDARD 11)
    # set(CMAKE_CXX_STANDARD_REQUIRED True)# 设置选项
    option(USE_MYMATH "Use my maths" ON)if( USE_MYMATH )# 将Maths文件夹加入编译add_subdirectory(Maths)list(APPEND EXTRA_LIBS MyMath)list(APPEND EXTRA_INCLUDES ${PROJECT_SOURCE_DIR}/Maths)
    endif()# 生成一个exe
    add_executable(MyHelloExe main.cpp)# 生成my_header.h文件,my_header.h.out中宏会被替换
    configure_file(my_header.h.out my_header.h)# 依赖的lib, target_link_directories可用来增加库目录
    target_link_libraries(MyHelloExe PUBLIC ${EXTRA_LIBS})# 头文件包含目录
    target_include_directories(MyHelloExe PUBLIC ${PROJECT_BINARY_DIR}/src ${EXTRA_INCLUDES} )# 测试加入预编译宏
    target_compile_definitions(MyHelloExe PRIVATE "HAVE_LOG" "HAVE_EXP")# 安装
    install(TARGETS MyHelloExe DESTINATION bin)
    install(FILES "${PROJECT_BINARY_DIR}/src/my_header.h" DESTINATION include )
  3. MyHello/src/main.cpp

    #include <iostream>
    #include "my_header.h"int main(int argc, char** argv)
    {std::cout << "hello world" << std::endl;std::cout << "Version Main is " << Hello_VERSION_MAJOR << std::endl;std::cout << "Version Minor is " << Hello_VERSION_MINOR << std::endl;#ifdef USE_MYMATHstd::cout << "use my math" << std::endl;
    #endifreturn 0;
    }
  4. MyHello/src/my_header.h.out
    一般会命名成my_header.h.in

    #define Hello_VERSION_MAJOR @Hello_VERSION_MAJOR@  //CMake的内置变量:<PROJECT-NAME>_VERSION_MAJOR
    #define Hello_VERSION_MINOR @Hello_VERSION_MINOR@  //CMake的内置变量:<PROJECT-NAME>_VERSION_MINOR
    #cmakedefine USE_MYMATH
    
  5. MyHello/src/Maths/CMakeLists.txt

    # 打印信息
    message(STATUS "add Maths library")# 编译生成dll,不依赖其他库
    add_library(MyMath SHARED mysqrt.cpp)# 安装
    install(TARGETS MyMath LIBRARY DESTINATION lib)
    install(TARGETS MyMath RUNTIME DESTINATION bin)
    install(FILES mysqrt.h DESTINATION include)
    
  6. MyHello/src/Maths/mysqrt.h
    测试用,无内容

  7. MyHello/src/Maths/mysqrt.cpp

    #include "mysqrt.h"
    

3. 参看

https://cmake.org/cmake/help/v3.21/guide/tutorial/index.html

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

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

相关文章

Linux移植IMX6ULL记录 一:编译源码并支持能顺利进入linux

目录 前言 一、不修改文件进行编译 二、修改设备树文件进行编译 前言 我用的开发板是100_ask_imx6ull_pro&#xff0c;其自带的linux内核版本linux-4.9.88&#xff0c;然后从linux官网下载过来的linux-4.9.88版本的arch/arm/configs/defconfig和dts设备树文件并没有对imx6ull…

安卓手机root+magisk安装证书+抓取https请求

先讲一下有这篇文章的背景吧&#xff0c;在使用安卓手机fiddler抓包时&#xff0c;即使信任了证书&#xff0c;并且手机也安装了证书&#xff0c;但是还是无法捕获https请求的问题&#xff0c;最开始不知道原因&#xff0c;后来慢慢了解到现在有的app为了防止抓包&#xff0c;把…

linux 常用命令指南(存储分区、存储挂载、docker迁移)

前言&#xff1a;由于目前机器存储空间不够&#xff0c;所以‘斥巨资’加了一块2T的机械硬盘&#xff0c;下面是对linux扩容的一系列操作&#xff0c;包含了磁盘空间的创建、删除&#xff1b;存储挂载&#xff1b;docker迁移&#xff1b;anaconda3迁移等。 一、存储分区 1.1 …

学习虚幻C++开发日志——委托(持续更新中)

委托 官方文档&#xff1a;Delegates and Lamba Functions in Unreal Engine | 虚幻引擎 5.5 文档 | Epic Developer Community | Epic Developer Community 简单地说&#xff0c;委托就像是一个“函数指针”&#xff0c;但它更加安全和灵活。它允许程序在运行时动态地调用不…

Git入门图文教程 -- 深入浅出 ( 保姆级 )

01、认识一下Git&#xff01;—简介 Git是当前最先进、最主流的分布式版本控制系统&#xff0c;免费、开源&#xff01;核心能力就是版本控制。再具体一点&#xff0c;就是面向代码文件的版本控制&#xff0c;代码的任何修改历史都会被记录管理起来&#xff0c;意味着可以恢复…

多传感器融合slam过程解析【大白话版】

SLAM&#xff08;同步定位与地图构建&#xff09;是自动驾驶、机器人导航和三维建模的关键技术之一。多传感器融合&#xff08;激光雷达、IMU、相机&#xff09;进一步提升了SLAM的鲁棒性和适应性&#xff0c;使其能够在复杂环境中实时构建高精度地图。本文将围绕激光雷达IMU相…

蓝桥杯每日真题 - 第18天

题目&#xff1a;&#xff08;出差&#xff09; 题目描述&#xff08;13届 C&C B组E题&#xff09; 解题思路&#xff1a; 问题分析 问题实质是一个带权图的最短路径问题&#xff0c;但路径的权重包含两个部分&#xff1a; 从当前城市到下一个城市的路程时间。 当前城市的…

每日论文23-24ESSERC 6.4-16.1Ghz混合并联-串联谐振器

《A 6.4-to-16.1GHz Hybrid Parallel-Series Resonator Mode-Switching Oscillator with 206.6dBc/Hz FoMT at 1MHz Offset in 40nm CMOS》 24ESSERC 首先这篇文章有个地方我其实没太明白&#xff0c;它在title和行文的时候都写的是“ hybrid parallel-series resonator mode-…

<QNAP 453D QTS-5.x> 日志记录:在 Docker 中运行的 Flask 应用安装 自签名 SSL 证书 解决 Chrome 等浏览器证书安全

原因&#xff1a;Chrome 不信任 ssc 证书 使启用了 HTTPS&#xff0c;即使有使用 自签名证书 (self-signed certificate 非由可信的证书颁发机构 【CA&#xff0c;Certificate Authority】签发的&#xff09;。浏览器 Chrome 默认不信任自签名证书&#xff0c;也会报 NET::ERR_…

【再谈设计模式】适配器模式 ~接口兼容的桥梁

一、引言 在软件开发的复杂世界里&#xff0c;不同的组件、类或者系统往往有着各自独立的设计和接口定义。当需要将这些原本不兼容的部分整合在一起协同工作时&#xff0c;就像尝试将方形的榫头插入圆形的卯眼一样困难。适配器设计模式就如同一位神奇的工匠&#xff0c;能够巧妙…

无人机的激光雷达避障系统阐述!

一、材料 激光二极管基底材料&#xff1a;激光二极管是激光雷达的核心组件之一&#xff0c;其基底材料通常采用硅或砷化镓。硅材料成本低、易于加工&#xff0c;但发光效率相对较低&#xff1b;而砷化镓材料发光效率高&#xff0c;但成本较高。 光学镜片材料&#xff1a;激光…

一篇快速上手 Axios,一个基于 Promise 的网络请求库(涉及原理实现)

Axios 1. 介绍1.1 什么是 Axios&#xff1f;1.2 axios 和 ajax 的区别 2. 安装使用3. Axios 基本使用3.1 Axios 发送请求3.2 其他方式发送请求3.3 响应结构3.4 Request Config3.5 默认配置3.6 创建实例对象发送请求 3.7 拦截器3.8 取消请求 4. 模拟 Axios4.1 axios 对象创建过程…

Three.js 相机控制器Controls

在 3D 场景中&#xff0c;摄像机的控制尤为重要&#xff0c;因为它决定了用户如何观察和与场景互动。Three.js 提供了多种相机控制器&#xff0c;最常用的有 OrbitControls、TrackballControls、FlyControls 和 FirstPersonControls。OrbitControls 适合用于查看和检查 3D 模型…

【新人系列】Python 入门(十一):控制结构

✍ 个人博客&#xff1a;https://blog.csdn.net/Newin2020?typeblog &#x1f4dd; 专栏地址&#xff1a;https://blog.csdn.net/newin2020/category_12801353.html &#x1f4e3; 专栏定位&#xff1a;为 0 基础刚入门 Python 的小伙伴提供详细的讲解&#xff0c;也欢迎大佬们…

SELinux

一、简介 SELinux : 安全强化的Linux&#xff1b;在开启后,会对进程本身部署安全上下文&#xff1b;会对文件部署安全上下文&#xff1b;对法务使用端口进行限制&#xff1b;对程序本身的不安全功能做限制 二、工作原理 1、工作方式 通过MAC的方式来控制管理进程&#xff0…

C++小白实习日记——Day 5 gitee怎么删文件,测试文件怎么写循环

昨晚一直内耗&#xff0c;一个程序写了三天写不出来&#xff0c;主要是耗时太多了&#xff0c;老板一直不满意。想在VScode上跑一下&#xff0c;昨晚一直报错。今天来公司重新搞了一下&#xff0c; 主要工作有&#xff1a; 1&#xff0c;读取当前时间用tscns 2&#xff0c;输…

Apache Paimon】-- 6 -- 清理过期数据

目录 1、简要介绍 2、操作方式和步骤 2.1、调整快照文件过期时间 2.2、设置分区过期时间 2.2.1、举例1 2.2.2、举例2 2.3、清理废弃文件 3、参考 1、简要介绍 清理 paimon &#xff08;表&#xff09;过期数据可以释放存储空间&#xff0c;优化资源利用并提升系统运行效…

阿里云IIS虚拟主机部署ssl证书

宝塔配置SSL证书用起来是很方便的&#xff0c;只需要在站点里就可以配置好&#xff0c;但是云虚拟主机在管理的时候是没有这个权限的&#xff0c;只提供了简单的域名管理等信息。 此处记录下阿里云&#xff08;原万网&#xff09;的IIS虚拟主机如何配置部署SSL证书。 进入虚拟…

BOM的详细讲解

BOM概述 BOM简介 BOM&#xff08;browser Object&#xff09;即浏览器对象模型&#xff0c;它提供了独立于内容而与浏览器窗口进行交互的对象&#xff0c;其核心对象是window。 BOM由一系列的对象构成&#xff0c;并且每个对象都提供了很多方法与属性 BOM缺乏标准&#xff…