当前位置: 首页 > news >正文

Cmake基础(5)

这篇文章主要描述如何使用cmake构建一个库工程

文章目录

  • add_library
  • install

库工程的代码:头文件和源文件

#ifndef ADD_H
#define ADD_H#ifdef _WIN32
#ifdef MYMATH_EXPORTS
#define MYMATH_API __declspec(dllexport)
#else
#define MYMATH_API __declspec(dllimport)
#endif
#else
#define MYMATH_API
#endifMYMATH_API int add(int a, int b);#endif  // ADD_H
#include "add.h"MYMATH_API int add(int a, int b) {return a + b;
}

add_library

编译库工程把之前的add_excuatable换为add_library
add_library 是 CMake 中用于定义库的命令。它的基本语法是:

add_library(target_name [STATIC | SHARED | MODULE] source1 [source2 ...])
  • target_name 是你想要给库定义的名称。
  • [STATIC | SHARED | MODULE] 是库的类型,有三种选择:
    • STATIC 表示静态库,即.lib文件(在Windows下)或者.a文件(在Linux下)。
    • SHARED 表示动态共享库,即.dll文件(在Windows下)或者.so文件(在Linux下)。
    • MODULE 表示模块,一般在使用 INSTALL(TARGETS ...) 时使用。

对于你的问题,add_library(${LIBRARY_NAME} SHARED ${cpp_list} ${h_list}) 意味着你正在创建一个动态共享库(DLL,在Windows下)并将指定的源文件 ${cpp_list} 和头文件 ${h_list} 编译为这个库。

一些说明:

  • 通常,如果你希望库在运行时动态加载(即在运行时可以通过 LoadLibrary 或类似的机制加载),你会选择 SHARED
  • 如果你希望生成一个静态库,即链接到可执行文件时被静态链接,你可以选择 STATIC
  • 如果你的库是一个插件,可能使用 MODULE

在这种情况下,SHARED 表示你正在创建一个动态库。

install

看这个:https://zhuanlan.zhihu.com/p/102955723
在cmake中添加这个

install(TARGETS ${LIBRARY_NAME}LIBRARY DESTINATION lib/$<CONFIG>ARCHIVE DESTINATION lib/$<CONFIG>RUNTIME DESTINATION bin/$<CONFIG>PUBLIC_HEADER DESTINATION include
)
# 头文件有时候不能自动拷贝,所以加上下面这个
# Install headers
file(GLOB LIBRARY_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/*.h)
install(FILES ${LIBRARY_HEADERS} DESTINATION include)

先编译,然后运行install,直接安装到默认位置了C:/Program Files (x86)

PS E:\workspace\cmake_demo\simple_demo\module\module_build> cmake --install . --config Debug  
-- Installing: C:/Program Files (x86)/MyMathLibrary/lib/Debug/MYLIB_x64d_msvc.lib
-- Installing: C:/Program Files (x86)/MyMathLibrary/bin/Debug/MYLIB_x64d_msvc.dll
-- Up-to-date: C:/Program Files (x86)/MyMathLibrary/include/add.hPS E:\workspace\cmake_demo\simple_demo\module\module_build> cmake --install . --config Release
-- Up-to-date: C:/Program Files (x86)/MyMathLibrary/lib/Release/MYLIB_x64_msvc.lib
-- Up-to-date: C:/Program Files (x86)/MyMathLibrary/bin/Release/MYLIB_x64_msvc.dll
-- Up-to-date: C:/Program Files (x86)/MyMathLibrary/include/add.h

修改安装路径

方法1:修改cmake文件。在cmake文件中加入set(CMAKE_INSTALL_PREFIX "../install")。
方法2:修改cmake命令参数。cmake -DCMAKE_INSTALL_PREFIX="../install"

使用方法2

PS E:\workspace\cmake_demo\simple_demo\module\module_build> cmake  -DCMAKE_INSTALL_PREFIX="../install" ..
-- Selecting Windows SDK version 10.0.22000.0 to target Windows 10.0.22631.
-- ^^^^^^Compiler: MSVC
-- Configuring done (0.0s)
-- Generating done (0.0s)
-- Build files have been written to: E:/workspace/cmake_demo/simple_demo/module/module_buildPS E:\workspace\cmake_demo\simple_demo\module\module_build> cmake --install . --config Release                                      
-- Installing: E:/workspace/cmake_demo/simple_demo/module/install/lib/Release/MYLIB_x64_msvc.lib
-- Installing: E:/workspace/cmake_demo/simple_demo/module/install/bin/Release/MYLIB_x64_msvc.dll
-- Installing: E:/workspace/cmake_demo/simple_demo/module/install/include/add.h

其实不止库工程可以install,可执行文件也可以install

相关文章:

Cmake基础(5)

这篇文章主要描述如何使用cmake构建一个库工程 文章目录 add_libraryinstall 库工程的代码&#xff1a;头文件和源文件 #ifndef ADD_H #define ADD_H#ifdef _WIN32 #ifdef MYMATH_EXPORTS #define MYMATH_API __declspec(dllexport) #else #define MYMATH_API __declspec(dll…...

Rabbitmq 死信取消超时订单

本文使用的版本 otp_win64_25.0rabbitmq-server-3.11.26rabbitmq插件 rabbitmq_delayed_message_exchange-3.11.1 pom.xml文件 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId> …...

C语言—每日选择题—Day55

指针相关博客 打响指针的第一枪&#xff1a;指针家族-CSDN博客 深入理解&#xff1a;指针变量的解引用 与 加法运算-CSDN博客 第一题 1. 若有如下定义&#xff0c;则 p1&m&#xff1b;p2p1&#xff1b; 是正确赋值语句.说法是否正确&#xff1f; int *p1; int *p2; int m …...

软件测试岗位的简历怎么写?项目怎么包装

已经帮大家打包好了包装好的简历模板&#xff0c;大家可以直接进行套用&#xff0c;详情请望下看 自动化测试相关教程推荐&#xff1a; 2023最新自动化测试自学教程新手小白26天入门最详细教程,目前已有300多人通过学习这套教程入职大厂&#xff01;&#xff01;_哔哩哔哩_bili…...

服务器解析漏洞是什么?攻击检测及修复

服务器解析漏洞&#xff08;Server-side Include Vulnerability&#xff0c;SSI漏洞&#xff09;是一种安全漏洞&#xff0c;通常出现在支持服务器端包含&#xff08;SSI&#xff09;功能的Web服务器上。SSI是一种在Web页面中嵌入动态内容的技术&#xff0c;允许开发人员将外部…...

HTML---CSS美化网页元素

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.div 标签&#xff1a; <div>是HTML中的一个常用标签&#xff0c;用于定义HTML文档中的一个区块&#xff08;或一个容器&#xff09;。它可以包含其他HTML元素&#xff0c;如文本、图像…...

【Docker】基础篇

文章目录 Docker为什么出现容器和虚拟机关于虚拟机关于Docker二者区别&#xff1a; Docker的基本组成相关概念-镜像&#xff0c;容器&#xff0c;仓库安装Docker卸载docker阿里云镜像加速docker run的原理**为什么容器比虚拟机快**Docker的常用命令1.帮助命令2.镜像相关命令3.容…...

Potplayer播放器远程访问群晖WebDav本地资源【内网穿透】

文章目录 本教程解决的问题是&#xff1a;按照本教程方法操作后&#xff0c;达到的效果是&#xff1a;1 使用环境要求&#xff1a;2 配置webdav3 测试局域网使用potplayer访问webdav3 内网穿透&#xff0c;映射至公网4 使用固定地址在potplayer访问webdav 国内流媒体平台的内容…...

【神经网络】imshow展示图片报错

文章目录 代码示例报错信息报错原因解决方法其他问题 代码示例 plt.imshow(np.squeeze(images[0]))报错信息 Invalid shape (3, 60, 90) for image data报错原因 格式错误&#xff0c;输入具有RGB值的图像&#xff0c;输入三维数组参数的格式应该是&#xff08;高度&#xf…...

【C++】对象特性:无参有参构造函数,拷贝构造函数,析构函数

目录 对象的初始化和清理1.1 构造函数和析构函数1.2 构造函数的分类及调用1.3 拷贝构造函数调用时机1.4 构造函数调用规则1.5 深拷贝与浅拷贝 对象的初始化和清理 生活中我们买的电子产品都基本会有出厂设置&#xff0c;在某一天我们不用时候也会删除一些自己信息数据保证安全。…...

【算法与数据结构】1005、LeetCode K 次取反后最大化的数组和

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析&#xff1a;本题允许某个下标的数字多次翻转&#xff0c;因此思路比较简单。首先&#xff0c;我们要求最大和&…...

作业--day34

使用select完成TCP并发服务器和客户端 server.c #include <myhead.h>#define PORT 8888 #define IP "192.168.125.137"int main(int argc, const char *argv[]) {int sfd socket(AF_INET, SOCK_STREAM, 0);if(sfd -1){perror("socket error");re…...

车辆违规开启远光灯检测系统:融合YOLO-MS改进YOLOv8

1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着社会的不断发展和交通工具的普及&#xff0c;车辆违规行为成为了一个严重的问题。其中&#xff0c;车辆违规开启远光灯是一种常见的违规行为&#xff0c;给其…...

爬虫工作量由小到大的思维转变---<第十三章 Scrapy之pipelines分离的思考>

前言: 收到留言: "我的爬取的数据处理有点大,scrapy抓网页挺快,处理数据慢了!" -----针对这位粉丝留言,我只想说:你那培训班老师可能给你漏了课程! 大概你们上课讲的案例属于demo,他教了你一些基本操作,但他没有对相关业务对你讲透! 你研究一下pipelines,或者看我现…...

【Unity】运行时创建曲线(贝塞尔的运用)

[Unity]运行时创建线&#xff08;贝塞尔的运用&#xff09; 1. 实现的目标 在运行状态下创建一条可以使用贝塞尔方法实时编辑的网格曲线。 2. 原理介绍 2.1 曲线的创建 unity建立网格曲线可以参考Unity程序化网格体的实现方法。主要分为顶点&#xff0c;三角面&#xff0c…...

基于DSP的IIR数字滤波器(论文+源码)

1.系统设计 在本次基于DSP的IIR数字低通滤波计中&#xff0c;拟以TMS320F28335来作为系统的主控制器&#xff0c;通过ADC0832模数转换芯片来对输入信号进行采集&#xff1b;通过TLC5615来将低通滤波后的信号进行输出&#xff1b;同时结合MATLAB仿真软件&#xff0c;对设计的II…...

Django(一)

1.web框架底层 1.1 网络通信 注意&#xff1a;局域网 个人一般写程序&#xff0c;想要让别人访问&#xff1a;阿里云、腾讯云。 去云平台租服务器&#xff08;含公网IP&#xff09;程序放在云服务器 先以局域网为例 我的电脑【服务端】 import socket# 1.监听本机的IP和…...

微信小程序如何利用createIntersectionObserver实现图片懒加载

微信小程序如何利用createIntersectionObserver实现图片懒加载 节点布局相交状态 API 可用于监听两个或多个组件节点在布局位置上的相交状态。这一组API常常可以用于推断某些节点是否可以被用户看见、有多大比例可以被用户看见。 节点布局相交状态 API中有一个 wx.createInter…...

七:爬虫-数据解析之正则表达式

七&#xff1a;正则表达式概述 正则表达式&#xff0c;又称规则表达式,&#xff08;Regular Expression&#xff0c;在代码中常简写为regex、regexp或RE&#xff09;&#xff0c;是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xf…...

云原生之深入解析亿级流量架构之服务限流思路与方法

一、限流思路 ① 熔断 系统在设计之初就把熔断措施考虑进去&#xff0c;当系统出现问题时&#xff0c;如果短时间内无法修复&#xff0c;系统要自动做出判断&#xff0c;开启熔断开关&#xff0c;拒绝流量访问&#xff0c;避免大流量对后端的过载请求。系统也应该能够动态监测…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建

制造业采购供应链管理是企业运营的核心环节&#xff0c;供应链协同管理在供应链上下游企业之间建立紧密的合作关系&#xff0c;通过信息共享、资源整合、业务协同等方式&#xff0c;实现供应链的全面管理和优化&#xff0c;提高供应链的效率和透明度&#xff0c;降低供应链的成…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

华为OD机试-食堂供餐-二分法

import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...

大模型多显卡多服务器并行计算方法与实践指南

一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...

Spring AI 入门:Java 开发者的生成式 AI 实践之路

一、Spring AI 简介 在人工智能技术快速迭代的今天&#xff0c;Spring AI 作为 Spring 生态系统的新生力量&#xff0c;正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务&#xff08;如 OpenAI、Anthropic&#xff09;的无缝对接&…...