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.rhkb.cn/news/317817.html

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

相关文章

uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之使用jar包插件

前言 如果你不会编写安卓插件,你可以先看看我之前零基础的文章(uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之零基础编写安卓插件), 我们使用第三方包,jar包编写安卓插件 开始 把依赖包,放到某个模块的/libs目录(myTestPlug/libs) 还要到build…

缓存分享(1)——Guava Cache原理及最佳实践

Guava Cache原理及最佳实践 1. Guava Cache是什么1.1 简介1.2 核心功能1.3 适用场景 2. Guava Cache的使用2.1 创建LoadingCache缓存2.2 创建CallableCache缓存 缓存的种类有很多&#xff0c;需要根据不同的应用场景来选择不同的cache&#xff0c;比如分布式缓存如redis、memca…

Java设计模式 _结构型模式_桥接模式

一、桥接模式 1、桥接模式 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式。用于把一个类中多个维度的抽象化与实现化解耦&#xff0c;使得二者可以独立变化。 2、实现思路 使用桥接模式&#xff0c;一定要找到这个类中两个变化的维度&#xff1a;如支…

【消息队列】RabbitMQ五种消息模式

RabbitMQ RabbitMQRabbitMQ安装 常见的消息模型基本消息队列SpringAMQPWorkQueue消息预取发布订阅模式Fanout ExchangeDirectExchangeTopicExchange 消息转换器 RabbitMQ RabbitMQ是基于Erlang语言开发的开源消息通信中间件 官网地址&#xff1a;https://www.rabbitmq.com/ R…

C语言趣味代码(四)

这一篇主要编写几个打字练习的小程序&#xff0c;然后通过这些小程序的实现来回顾复习我们之前学过的知识&#xff0c;然后通过这写打字练习的小程序来提升我们的打字技术和编程技术。 1. 打字练习 1.1 基本打字练习 1.1.1 基本实现 首先我们来制作一个用于计算并显示输入一…

嵌入式学习59-ARM7(自动设备号和混杂设备)

知识零碎&#xff1a; 头文件查找&#xff1a; /arm/路径下的头文件 linux驱动程序的编写&#xff0c;编译&#xff0c;运行过程 -------------------------------------------------------------------------------------------------------------------------------- 1.…

【C语言】深入了解文件:简明指南

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、文件的概念1.1 文件名:1.2 程序文件和数据文件 二、数据文…

手拉手springboot整合kafka

前期准备安装kafka 启动Kafka本地环境需Java 8以上 Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。 Kafka启动方式有Zookeeper和Kraft&#xff0c;两种方式只能选择其中一种启动&#xff0c;不能同时使用。 Kafka下载…

头歌:Spark的安装与使用

第1关&#xff1a;Scala语言开发环境的部署 相关知识 Scala是一种函数式面向对象语言&#xff0c;它融汇了许多前所未有的特性&#xff0c;而同时又运行于JVM之上。随着开发者对Scala的兴趣日增&#xff0c;以及越来越多的工具支持&#xff0c;无疑Scala语言将成为你手上一件…

第5篇:创建Nios II工程之Hello_World<四>

Q&#xff1a;最后我们在DE2-115开发板上演示运行Hello_World程序。 A&#xff1a;先烧录编译Quartus硬件工程时生成的.sof文件&#xff0c;在FPGA上成功配置Nios II系统&#xff1b;然后在Nios II Eclipse窗口右键点击工程名hello_world&#xff0c;选择Run As-->Nios II …

如何使用Go语言进行并发安全的数据访问?

文章目录 并发安全问题的原因解决方案1. 使用互斥锁&#xff08;Mutex&#xff09;示例代码&#xff1a; 2. 使用原子操作&#xff08;Atomic Operations&#xff09;示例代码&#xff1a; 3. 使用通道&#xff08;Channels&#xff09; 在Go语言中&#xff0c;进行并发编程是常…

SpringMVC整体工作流程

. 用户发起一个请求&#xff0c;请求首先到达前端控制器前端控制器接收到请求后会调用处理器映射器&#xff0c;由此得知&#xff0c;这个请求该由哪一个Controller来进行处理(并未调用Controller)&#xff1b;前端控制器调用处理器适配器&#xff0c;告诉处理器适配器应该要…

搭建vue3组件库(三): CSS架构之BEM

文章目录 1. 通过 JS 生成 BEM 规范名称1.1 初始化 hooks 目录1.2 创建 BEM 命名空间函数1.3 通过 SCSS 生成 BEM 规范样式 2. 测试 BEM 规范 BEM 是由 Yandex 团队提出的一种 CSS 命名方法论&#xff0c;即 Block&#xff08;块&#xff09;、Element&#xff08;元素&#xf…

qt-C++笔记之滑动条QSlider和QProgressBar进度条

qt-C笔记之滑动条QSlider和QProgressBar进度条 —— 2024-04-28 杭州 本例来自《Qt6 C开发指南》 文章目录 qt-C笔记之滑动条QSlider和QProgressBar进度条1.运行2.阅读笔记3.文件结构4.samp4_06.pro5.main.cpp6.widget.h7.widget.cpp8.widget.ui 1.运行 2.阅读笔记 3.文件结构…

安装VMware Tools报错处理(SP1)

一、添加共享文件 因为没有VMware Tools&#xff0c;所以补丁只能通过共享文件夹进行传输了。直接在虚拟机的浏览器下载的话&#xff0c;自带的IE浏览器太老了&#xff0c;网站打不开&#xff0c;共享文件夹会方便一点&#xff0c;大家也可以用自己的方法&#xff0c;能顺利上…

关于我转生从零开始学C++这件事:升级Lv.10

❀❀❀ 文章由不准备秃的大伟原创 ❀❀❀ ♪♪♪ 若有转载&#xff0c;请联系博主哦~ ♪♪♪ ❤❤❤ 致力学好编程的宝藏博主&#xff0c;代码兴国&#xff01;❤❤❤ 盘古开天辟地&#xff0c;大伟五一更新。大家好哇&#xff0c;大伟今天继续给大家来更新我们的C&#xff1a;…

【Linux】进程终止

思维导图 学习内容 进程终止是进程控制里面的一个重要的知识&#xff0c;通过这一篇博客&#xff0c;我们可以学习到进程终止的概念&#xff0c;进程终止的三种情况&#xff0c;进程终止的退出码和退出信号&#xff0c;最后在来学习进程是如何进行终止的。 学习目标 进程终止…

CTFHub-Web-文件上传

CTFHub-Web-文件上传-WP 一、无验证 1.编写一段PHP木马脚本 2.将编写好的木马进行上传 3.显示上传成功了 4.使用文件上传工具进行尝试 5.连接成功进入文件管理 6.上翻目录找到flag文件 7.打开文件查看flag 二、前端验证 1.制作payload进行上传发现不允许这种类型的文件上传 …

3.8设计模式——State 状态模式(行为型)

意图 允许一个对象在其内部状态改变时改变它的行为。对象看起来似乎修改了它的类。 结构 Context&#xff08;上下文&#xff09;定义客户感兴趣的接口&#xff1b;维护一个ConcreteState子类的实例&#xff0c;这个实例定义当前状态。State&#xff08;状态&#xff09;定义…

【LangChain系列 12】Prompt模版——序列化

本文速读&#xff1a; PromptTemplate FewShotPromptTemplate 通常prompt以文件形式存储比python代码更好&#xff0c;一方面可以更容易共享、存储。本文将介绍在LangChain中如何对prompt以不同的方式序列化。 一般来说&#xff0c;对于序列化有以下两个设计原则&#xff1a…