CMake使用

一、CMake 是什么

  • CMake 是一个跨平台的自动化构建系统,它使用配置文件 CMakeLists.txt 来管理软件构建过程。
  • CMake 基于 Makefile 做了二次开发。

二、单个文件目录

在这里插入图片描述

# CMake 最低版本号要求
cmake_minimum_required(VERSION 3.16.3)# 工程名
project(CMakeSingle)# 变量赋值
set(SRC_LIST main.cpp)
set(SRC_LIST2 main2.cpp)# 输出信息
message(STATUS "this is binary dir" ${PROJECT_BINARY_DIR})
message(STATUS "this is source dir" ${PROJECT_SOURCE_DIR})# 生产执行文件名 
add_executable(main ${SRC_LIST})
add_executable(main2 ${SRC_LIST2})

三、子目录

在这里插入图片描述

cmake_minimum_required(VERSION 3.16.3)project(CMakeSub)message(STATUS "PROJECT_BINARY_DIR " ${PROJECT_BINARY_DIR})
message(STATUS "PROJECT_SOURCE_DIR " ${PROJECT_SOURCE_DIR})
message(STATUS "CMAKE_CURRENT_SOURCE_DIR " ${CMAKE_CURRENT_SOURCE_DIR})# 添加子目录
add_subdirectory(src)
cmake_minimum_required(VERSION 3.16.3)message(STATUS "PROJECT_BINARY_DIR " ${PROJECT_BINARY_DIR})
message(STATUS "PROJECT_SOURCE_DIR " ${PROJECT_SOURCE_DIR})
message(STATUS "CMAKE_CURRENT_SOURCE_DIR " ${CMAKE_CURRENT_SOURCE_DIR})SET(SRC_LIST main.cpp)add_executable(main ${SRC_LIST})
add_executable(main2 ${SRC_LIST})

四、多个文件目录,子目录编译成库文件

在这里插入图片描述

cmake_minimum_required(VERSION 3.16.3)project(CMakeMany1)add_subdirectory(src)
cmake_minimum_required(VERSION 3.16.3)message(STATUS "CMAKE_CURRENT_SOURCE_DIR ->" ${CMAKE_CURRENT_SOURCE_DIR})SET(SRC_LIST main.cpp)# 添加 dir1 头文件路径
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/dir1") # 或 include_directories(dir1) 相对路径的方式
# 添加 dir1 子目录
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/dir1")# 添加 dir2 头文件路径
include_directories("${CMAKE_CURRENT_SOURCE_DIR}/dir2")
# 添加 dir2 子目录
add_subdirectory("${CMAKE_CURRENT_SOURCE_DIR}/dir2")add_executable(zcoder ${SRC_LIST})
target_link_libraries(zcoder dir1 dir2)# 安装目录到某个路径,
# 默认路径:/usr/local/
# 指定路径:cmake -DCMAKE_INSTALL_PREFIX=/../build/ ..# 将执行文件安装到 bin 目录
install(TARGETS zcoder RUNTIME DESTINATION bin)
# 将目录安装到指定位置
install(DIRECTORY ../doc/ DESTINATION share/doc/)
# 加载所有的源码
aux_source_directory(. DIR_SRCS) # <=> set(DIR_SRCS dir1.cpp dir11.cpp)# 默认是静态库 .a
# add_library(dir1 SHARED ${DIR_SRCS}) 动态库 .so
add_library(dir1 ${DIR_SRCS})
aux_source_directory(. DIR_SRCS)add_library(dir2 ${DIR_SRCS})

五、多个文件目录,子目录使用源码编译

在这里插入图片描述

cmake_minimum_required(VERSION 3.16.3)project(CMakeMany2)add_subdirectory(src)
cmake_minimum_required(VERSION 3.16.3)set(SRC_LIST main.cpp)# 设置子目录
set(SUB_DIR_LIST "${CMAKE_CURRENT_SOURCE_DIR}/dir1" "${CMAKE_CURRENT_SOURCE_DIR}/dir2")foreach(SUB_DIR ${SUB_DIR_LIST})# 自动添加头文件include_directories(${SUB_DIR})# 遍历源文件aux_source_directory(${SUB_DIR} SRC_LIST)message(STATUS "SUB_DIR -> " ${SUB_DIR})message(STATUS "SUB_LSIT" -> ${SRC_LIST})
endforeach()add_executable(zcoder ${SRC_LIST})

六、生成动态库

在这里插入图片描述

cmake_minimum_required(VERSION 3.16.3)
project(CMakeSHARED)# cmake -DCMAKE_BUILD_TYPE=Release ..
# 设置 Release 版本还是 Debug 版本
if (${CMAKE_BUILD_TYPE} MATCHES "Release") # 不带 -gset(BuildType "Release")message(STATUS "Release版本")
else()                                     # 带 -gset(BuildType "Debug")message(STATUS "Debug版本")
endif()add_compile_options(-fPIC) # 动态库必须的选项aux_source_directory(. DIR_LIB_SRCS)# 生成动态库
add_library(Dir1 SHARED ${DIR_LIB_SRCS})# 设置动态库最后输出的路径
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/${BuildType})

七、生成静态库

在这里插入图片描述

# cmake -DCMAKE_INSTALL_PREFIX=/../build/ ..cmake_minimum_required(VERSION 3.16.3)
project(CMakeSTATIC)AUX_SOURCE_DIRECTORY(. DIR_LIB_SRCS)ADD_LIBRARY (Dir1 STATIC ${DIR_LIB_SRCS})# 将库文件安装到 /lib 目录
INSTALL(TARGETS Dir1 ARCHIVE DESTINATION lib)
# 将头文件安装到 /include 目录
INSTALL(FILES dir1.hpp DESTINATION include) 

八、调用动态库、静态库

  • 如果同时存在动态库和静态库,优先链接动态库
  • 强制链接静态库使用 target_link_libraries(zcoder libDir1.a)

在这里插入图片描述

cmake_minimum_required(VERSION 3.16.3)
project(CMakeLink)set(SRC_LIST main.cpp)include_directories("${CMAKE_CURRENT_SOURCE_DIR}/lib")link_directories("${CMAKE_CURRENT_SOURCE_DIR}/lib")# 引用动态库
add_executable(zcoder ${SRC_LIST})
target_link_libraries(zcoder Dir1)
# target_link_libraries(zcoder libDir1) # 错误
# target_link_libraries(zcoder libDir1.so) # 正确# 强制找静态库
# target_link_libraries(zcoder libDir1.a)

九、find_package()

  • find_package() 会查找 Findxx.cmake 文件。
cmake_minimum_required(VERSION 3.16.3)
project(CMakeFind)set(SRC_LIST main.cpp)add_compile_options(-std=c++11)# 是否启用 openssl
set(ENABLE_OPENSSL true)# 查找 openssl 是否安装 
find_package(OpenSSL REQUIRED)
if(OPENSSL_FOUND AND ENABLE_OPENSSL)message(STATUS "找到 openssl 库:\"${OPENSSL_INCLUDE_DIR}\"")# 添加 openssl 的头文件路径include_directories(${OPENSSL_INCLUDE_DIR})# 添加 ENABLE_OPENSSL 的宏定义add_definitions(-DENABLE_OPENSSL)# 将 OPENSSL_LIBRARIES 的库文件名(包含路径)追加到 LINK_LIB_LISTlist(APPEND LINK_LIB_LIST ${OPENSSL_LIBRARIES}) 
else()message(STATUS "没有找到 openssl 库")
endif()# 编译动态库
# 1. 生成动态库
add_library(${CMAKE_PROJECT_NAME}_shared SHARED ${SRC_LIST})
# 2. 链接其他库
target_link_libraries(${CMAKE_PROJECT_NAME}_shared ${LINK_LIB_LIST})
# 3. 动态库输出时,不以 xx_shared 输出,而是以 xx 输出
set_target_properties(${CMAKE_PROJECT_NAME}_shared PROPERTIES OUTPUT_NAME ${CMAKE_PROJECT_NAME})# 编译静态库
add_library(${CMAKE_PROJECT_NAME}_static STATIC ${SRC_LIST})
target_link_libraries(${CMAKE_PROJECT_NAME}_static ${LINK_LIB_LIST})
set_target_properties(${CMAKE_PROJECT_NAME}_static PROPERTIES OUTPUT_NAME ${CMAKE_PROJECT_NAME})add_executable(zcoder ${SRC_LIST})target_link_libraries(zcoder ${LINK_LIB_LIST})

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

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

相关文章

uniapp自定义返回事件(封装)

uniapp自定义返回事件 在我们使用uniapp时&#xff0c;我们导航栏一般都是自定义的&#xff0c;比如用uview框架的导航栏&#xff0c;那么返回事件通常会遇到以下几个问题 返回事件前需要做一些额外的处理 h5项目刷新页面后返回失效 返回按钮点击后到指定页面 如果只是监听返…

PhotosCollage for Mac:优雅且实用的照片拼贴软件

PhotosCollage for Mac是一款优雅且实用的照片拼贴软件&#xff0c;为Mac用户提供了一个便捷、高效的平台&#xff0c;以创建精美、个性化的照片拼贴作品。 PhotosCollage for Mac v1.4.1激活版下载 该软件界面简洁直观&#xff0c;操作便捷。用户只需将想要拼贴的照片拖入“照…

CSS基础:position定位的5个类型详解!

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

Andorid复习

组件 TextView 阴影 android:shadowColor"color/red" 阴影颜色android:shadowRadius"3.0" 阴影模糊度&#xff08;大小&#xff09;android:shadowDx"10.0" 横向偏移android:shadowDy"10.0" 跑马灯 这里用自定义控件 public cla…

日本极致产品力 | 源自内蒙古,日本99.7%的人都喝过都百年畅销饮料

​《极致产品力》日本深度研学是一个顾问式课程,可以帮助企业找产品、找方向、找方法,在日本终端市场考察中洞悉热销产品背后的成功逻辑,了解最新最前沿的产品趋势和机会。结合日本消费趋势中国转化的众多经验,从品牌、包装、卖点、技术和生产工艺等多方面寻找中国市场的解决方…

WIFI/BT中蓝牙的硬件资源是如何调度的 UART和PCM接口传输的是什么信号

安卓或IOS手机中&#xff0c;wifi/bt中的蓝牙是如何调度硬件资源的&#xff0c;尤其是UART和PCM是如何分配的。M.2 wifi/bt模块或其他形式的模块中&#xff0c;蓝牙是如何调度硬件资源的&#xff0c;尤其是UART和PCM是如何分配的。今天我们就图文并茂的解决这个问题。 蓝牙文件…

新买的设备自带的仪器校准证书,是否可以作为校准报告使用?

设备在刚刚购买时&#xff0c;有些商家会承诺&#xff0c;在交付设备的同时&#xff0c;还会交付设备的校准证书&#xff0c;这证书是附赠的&#xff0c;属于商家给客户的一种福利&#xff0c;面对附赠的仪器校准证书&#xff0c;很多客户也会有疑惑&#xff0c;这附赠的证书有…

UTONMOS:用区块链技术拓展商业边界在哪里?

引言 大约从 2021 年Web 3 这个新概念开始受到风险基金和科技圈的普遍关注。但如果你对过去几年区块链的发展历史足够了解&#xff0c;就应该已经意识到现在的 Web 3 并不是什么新技术&#xff0c;甚至不是旧技术的进步&#xff0c;它只是一个基于区块链技术的宏大构想。 我是…

Unity 如何制作和发布你的 Package

一、制作你的第一个 Package Unity Package 不做过多赘述&#xff0c;像 URP 本质上也是一个 Package&#xff0c;在 Unity 中可以通过菜单栏 → Window → Package manager 来管理你当前的所有 Package 本篇文章主要介绍&#xff1a;如何制作并发布属于你的 Package 1.1 Pac…

自制贪吃蛇小游戏

此片文章涉及到到控制台设置的相关操作&#xff0c;虚拟键码&#xff0c;宽字符输出等&#xff0c;有些地方大家可能会看不懂&#xff0c;可以阅读以下文章来进一步了解&#xff1a; 控制台程序设置-CSDN博客 效果展示&#xff1a; QQ2024428-181932 源码已放在文章结尾 目录 …

Graph Neural Networks(GNN)学习笔记

本学习笔记的组织结构是&#xff0c;先跟李沐老师学一下&#xff0c;再去kaggle上寻摸一下有没有类似的练习&#xff0c;浅做一下&#xff0c;作为一个了解。 ———————————0428更新—————————————— 课程和博客看到后面准备主要看两个&#xff1a;GCN和…

ubuntu安装Anaconda安装及conda使用

一. 安装anaconda3详细教程 1、下载镜像 清华大学开源软件镜像站下载地址&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 下拉到最低端选择Linux&#xff0c;选择最新版&#xff08;32/64位&#xff09;下载。这里我下载的是版本Anaconda3-4.3.30-Linux…

Java中的File类

File类概述和构造方法 File&#xff1a;它是文件和目录路径名的抽象表示 文件和目录是可以通过File封装成对象的 对于File而言&#xff0c;其封装的并不是一个真正存在的文件&#xff0c;仅仅是一个路径名而已&#xff0c;它可以存在&#xff0c;也可以不存在 我们对Fie的操…

大厂常见算法50题-替换空格

专栏持续更新50道算法题&#xff0c;都是大厂高频算法题&#xff0c;建议关注, 一起巧‘背’算法! 文章目录 题目解法一 String类replace方法解法二 遍历替换总结 题目 解法一 String类replace方法 String类自带的replace&#xff0c;方法传入两个char类型的参数&#xff0c;分…

【MySQL 数据宝典】【索引原理】- 004 优化示例-join in exist

一、join 优化原理 1.1 基本连接方式介绍 JOIN 是 MySQL 用来进行联表操作的&#xff0c;用来匹配两个表的数据&#xff0c;筛选并合并出符合我们要求的结果集。 1.2 驱动表的定义 1.2.1 什么是驱动表 多表关联查询时,第一个被处理的表就是驱动表,使用驱动表去关联其他表.驱…

使用 SSH 密钥配置 Git 账号需要以下步骤

1、生成 SSH 密钥&#xff1a; 如果你还没有 SSH 密钥&#xff0c;可以使用以下命令在电脑终端中生成一个新的 SSH 密钥&#xff1a; ssh-keygen -t rsa -b 4096 -f /Users/XXXX/.ssh/id_rsa_my_personal -C "your_emailexample.com" ssh-keygen 是用于生成 SSH 密…

《Fundamentals of Power Electronics》——Buck、Boost、Buck-Boost三个电路的CCM-DCM工作特性总结

Buck、Boost、Buck-Boost这三个电路的CCM-DCM工作特性总结如下表所示&#xff1a; Buck、Boost、Buck-Boost这三个电路工作在DCM模式下电压传输比的对比图如下所示&#xff1a; 由上图可知&#xff0c;Buck-Boost电路的工作特性是一条斜率为的直线&#xff0c;Buck电路和Boost电…

RK3588 - RKNN(Rockchip 神经处理单元)的逆向工程

本文翻译自https://jas-hacks.blogspot.com/2024/02/rk3588-reverse-engineering-rknn.html RK3588 NPU 的内部操作和功能主要隐藏在名为RKNPU2的闭源 SDK 中。由于对大型语言模型 (LLM) 的兴趣以及对transform模型最佳矩阵乘法的追求&#xff0c;想了解 RKNPU SDK 新引入的矩阵…

自动开箱机:提升包装物流效率的关键设备

随着电子商务的飞速发展&#xff0c;物流行业面临着重要的挑战和机遇。如何在保证服务质量的同时&#xff0c;提高物流效率&#xff0c;降低成本&#xff0c;成为摆在物流企业面前的重要课题。在这个背景下&#xff0c;自动开箱机以其高效、精准、省力的特点&#xff0c;正逐渐…

OpenMM——教程学习(1)

如何从零开始做一个蛋白小分子动力学模拟 AmberTools将被用来生成输入文件&#xff0c;OpenMM 将被用来运行模拟&#xff0c;模拟平台为在线百度AI Stuio, 并使用GPU加速。 First thing’s first, 到PDB 蛋白数据库下载一需要模拟的靶点晶体&#xff0c;备用。 1. H web server…