Cmake的动态链接库dll的生成并测试

2023-05-16

一.项目任务

1.完成一个CMake工程生成一个动态库,该动态库包含内容:

(1)包含一个StringUtil类,该类具有Split和Trim2个静态方法。上述2个接口的定义如下:
/// 删除字符串两侧的空格, s的值不会被修改
/// @param s const string& 源字符串
/// @return string
static string Trim(const string& s);

/// 把输入目标字符串按照分隔符(字符串)分割为一组字符串, 追加到vec
/// @param s const string& 源字符串
/// @param c const string& 分割字符串
/// @param vec StringList& 输出参数,分解后的字符串向量
/// @return void
static void Split(StringList& vec, const string& s, const string& c);

2.完成动态链接库中方法的测试

二.动态链接库的生成

1.首先构建如下项目目录

1.my_lib文件夹
2.在my_lib文件夹下新建bin文件夹、my_lib.cpp、my_lib_export.h、CMakeLists.txt
3.在my_lib的同级目录下新建另一个CMakeLists.txt

在这里插入图片描述

2.源码如下

(1)my_lib.cpp
(如果想要获得lib文件则必须使用__declspec(dllexport),需要在每一个类以及函数前加这个前缀,才能生成lib文件,同样在后面的动态链接库的使用时要用到__declspec(dlimport)前缀,这样才能调用封装在动态链接库中的函数。)

#include "my_lib_export.h"
#pragma once
#define MY_LIB_API __declspec(dllexport)


void MY_LIB_API  StringUtil::Split(vector<string>& res,const string &str, const string &pattern)
{
    if(str == "")
        return;
    //在字符串末尾也加入分隔符,方便截取最后一段
    string strs = str + pattern;
    size_t pos = strs.find(pattern);

    while(pos != strs.npos)
    {
        string temp = strs.substr(0, pos);
        res.push_back(temp);
        //去掉已分割的字符串,在剩下的字符串中进行分割
        strs = strs.substr(pos+pattern.size(), strs.size());
        pos = strs.find(pattern);
    }
}
void MY_LIB_API StringUtil::Trim(const string& s)
{
   string s1=s;
   if (s1.empty())
    {
        return ;
    }
    s1.erase(0,s1.find_first_not_of(" "));
    s1.erase(s1.find_last_not_of(" ") + 1);

}

(2)my_lib_export.h

#pragma once
#define MY_LIB_API __declspec(dllexport)

#include <iostream>

#include<string>

#include<vector>
#include<stdio.h>
#include<sstream>
using namespace std;
class MY_LIB_API  StringUtil{
public:
    static void   Trim(const string& s);
    static void  Split(vector<string>& vec, const string& s, const string& c);

};

(3)my_lib文件夹下的CMakeLists.txt

    PROJECT(CC1)
	
    ADD_LIBRARY(PRD_6 SHARED my_lib.cpp)

(4)my_lib同目录下的的CMakeLists.txt

#cmake的最低版本
cmake_minimum_required(VERSION 3.24.0)
#工程文件名称,可以与内部的CMakeLists.txt中项目名称不一致,最终会生成两个sln文件,项目CC2将会在demo目录下生成,内部CMakeLists.txt中所创建的CC1项目会添加到bin文件夹里
project(CC2)
#将构建添加到bin文件夹中
ADD_SUBDIRECTORY(my_lib  bin)


3.使用cmd进入到my_lib文件夹,执行cmake指令:

cmake . .
在这里插入图片描述

4.my_lib文件夹中或bin文件夹中会生成CC2.sln或者CC1.sln。任选一个打开(二者效果相同)进行编译,编译后将会在bin/Debug中生成PRD_6.dll与PRD_6.lib,调用动态链接库时将会使用到这两个文件,二者就是所保存的封装的类与函数。(如果sln的编译运行过程出现问题,请参考我的上篇博客。

在这里插入图片描述

三.动态链接库的使用

1.构建项目目录

文件结构与上面基本一致,但需要将生成的PRD_6.dll与PRD_6.lib放到bin文件夹下
在这里插入图片描述

2.源码

1.main.cpp

#pragma comment(lib,"PRD_6.lib")
#调用lib动态链接库
#include "my_lib.h"

#include<iostream>
#include<string>
#include<vector>
using namespace std;
int main()
{
    StringUtil S;
    string s1="kbcxajcbaaanjknkaaad";
    string s2="aaa";
    vector<string> res;
    S.Split(res,s1,s2);
    cout << res[0]<<endl;
    cout << res[1] << endl;
    cout << res[2] << endl;
  
    return 0;
}

2.my_lib.h

#pragma comment(lib,"PRD_6.lib")
#define MY_LIB_API __declspec(dllimport)
#头文件中需要添加调用的类,并在类名前加 __declspec(dllimport)前缀,如果原来的动态链接库只是写了函数,则在这里就在需要写出用到的函数并在函数名前加__declspec(dllimport)前缀
#include <iostream>

#include<string>

#include<vector>
#include<stdio.h>
#include<sstream>
using namespace std;
class MY_LIB_API  StringUtil{
public:
    static void   Trim(const string& s);
    static void  Split(vector<string>& vec, const string& s, const string& c);

};

3.demo里的CMakeLists.txt

cmake_minimum_required(VERSION 3.10.0)
# 最低版本要求 cmake 构建工具小于3.10.0将报错
 
project(demo)
# 工程项目名称
 
#aux_source_directory(${CMAKE_SOURCE_DIR} RP_ALL_SRC)
# 这里对 ${CMAKE_SOURCE_DIR} 也就是当前CMakeList.txt 目录下的*.cpp输出到变量
# RP_ALL_SRC (ROOTPATH_ALL_SRC 意为顶层目录所有源码)

include_directories(test_lib) # 添加头文件包含目录

#link_directories(G:/VStudio/SHIXI_PRD6/mylib)
# 添加链接库文件目录  注意,此行必须在add_executable前,否则编译器在生成main.exe时将无法找到库文件

add_executable(main main.cpp)
 
target_link_libraries(main PRD_6.lib)  
#为生成目标添加一个库 可以是多个 比如 target_link_libraries(main lib1 lib2)


4.与demo同目录下的CMakeLists.txt


cmake_minimum_required(VERSION 3.24.0)
project(CC)
ADD_SUBDIRECTORY(demo  bin)

5.将上面所得到的PRD_6.lib以及PRD_6.dll复制并放到bin文件夹中

3.使用cmd进入到demo文件夹中,执行cmake指令

cmake . .
在这里插入图片描述

4.编译执行完成,将会在demo文件夹以及bin文件夹下生成CC.sln以及demo.sln(二者相同)任选一个打开进行编译在这里插入图片描述

5.成功调用动态链接库的函数,输出结果

在这里插入图片描述

四.总结

这次实验中遇到了许多的问题,例如没有生成lib文件,不能成功调用lib文件等等,不过在不断的尝试与查找资料的努力下,最终还是成功的完成了任务,收获满满!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cmake的动态链接库dll的生成并测试 的相关文章

  • 宏函数 可变参数 C/C++

    span class token macro property span class token directive hash span span class token directive keyword include span spa
  • 排查ingress 404报错的方法--附:在容器中使用tcpdump抓包

    出现这个问题 xff0c 一般是由于路由不通导致的 xff0c 需要进行抓包排查 首先要解决的问题是 xff0c 如何在 ingress controller 容器中安装抓包工具 1 由于 ingress controller 的mando
  • fastApi介绍与重要版本更新细节

    fastApi介绍 FastAPI 是用于使用 Python 构建 API 的现代 Web 框架 它建立在 Starlette 框架之上 xff0c Starlette 框架是一个轻量级且可扩展的 ASGI xff08 异步服务器网关接口
  • 3. fastApi查询参数详解

    当声明的参数不是路径参数时 xff0c 路径操作函数会把该参数自动解释为查询参数 如下 路径操作函数将参数skip limit解释为查询参数 query parameter span class token decorator annota
  • 4. fastApi请求体详解

    简单介绍网络请求 网络请求是指客户端 xff08 例如浏览器 移动应用程序等 xff09 向服务器发送请求 xff0c 以获取特定资源或执行特定操作的过程 HTTP请求是一种常见的网络请求协议 xff0c 它通过互联网连接客户端和服务器 x
  • python多线程与多进程简略介绍

    GIL介绍 在python中GIL的限制导致不论是在单核还是多核条件下 xff0c 同时刻都只能运行 一个线程 xff0c 这使得Python多线程无法发挥多核并行的优势 GIL全称为Global Interpreter Lock意思是全局
  • 高并发场景下,python各web框架的优劣对比与示例分析

    高并发场景下 xff0c python各个web框架的优劣对比与示例分析 Python有许多适合高并发场景的Web框架 xff0c 下面是其中几个 xff1a Flask Flask是一个轻量级的Web框架 xff0c 由Werkzeug和
  • 6. fastApi文件上传请求处理示例

    需求 xff1a 开发文件上传功能接口 接口路径 files 请求类型 post 响应结果 返回文件的大小 单位bytes 实现方案 使用post类型处理方法 xff0c 指定参数类型为bytes或UploadFile 使用File 方法处
  • 7. fastApi表单数据处理详解与示例

    需求 前端通过表单数据的形式发送用户名与密码到后端 xff0c 后端通过用户信息校验 xff0c 过滤出合法用户 xff0c 并为用户设置cookie 超时时间为24h xff09 接口路径 login 请求类型 post方法发送的文件 响
  • C语言结构体字节对齐规则

    C语言结构体字节对齐规则 基本规则 规则1 xff1a 结构体 xff08 struct xff09 的数据成员 xff0c 第一个数据成员放在offset为0的地方 xff0c 以后每个数据成员存放在offset为该数据成员大小的整数倍的
  • 如何处理C++构造函数中的错误

    用C 43 43 写代码的时候总是避免不了处理错误 xff0c 一般来说有两种方式 xff0c 通过函数的返回值或者抛出异常 C语言的错误处理一律是通过函数的返回值来判断的 xff0c 一般是返回0 NULL 或者 1 表示错误 xff0c
  • 改进后的A星三维路径规划完整算法(matlab语言),包括障碍物模型优化

    改进后的A星三维路径规划完整算法 matlab语言 xff0c 包括障碍物模型优化 xff0c 平滑处理 xff0c 启发函数的改进 xff0c 环境地图可以根据自己的实际情况进行改进 xff0c 算法包含了非常详细的代码注释 ID 695
  • 8. fastApi请求错误处理方式与示例

    请求错误处理 某些情况下 xff0c 需要向客户端返回错误提示 需要向客户端返回错误提示的场景主要如下 xff1a 客户端没有执行操作的权限客户端没有访问资源的权限客户端要访问的项目不存在服务器内部错误 遇到这些情况时 xff0c 通常要返
  • 9. fastApi的json编码器使用示例

    JSON 编码器 有时 xff0c 我们要把 Pydantic 模型等数据类型转换为字典 列表等与 JSON 兼容的格式 例如 xff0c 把 Pydantic 模型存入数据库时就要进行转换 为此 xff0c FastAPI 提供了 jso
  • 10. fastApi数据更新方法

    用 PUT 更新数据 把输入数据转换为 JSON 数据 xff08 例如 xff0c 使用 NoSQL 数据库时 xff09 xff0c 可以使用 jsonable encoder 例如 xff0c 把 datetime 转换为 str P
  • 写在前面--(与各位读者聊聊)

    xff61 xff65 xff65 xff89 xff9e 嗨 xff01 我是jesse xff0c 欢迎来到我的Python爬虫博客专栏 xff01 在本专栏中 xff0c 我将分享Python爬虫技术的各个方面 xff0c 包括基础知
  • 爬虫示例一【简单爬虫实现】

    爬虫构建 回顾以上的接口分析过程 xff0c 整个对我们有用的请求过程是 xff0c 浏览器发送一个GET请求 xff0c 直接获取到了我们想要的数据页面 那么如何通过python代码复现以上的请求过程呢 xff1f 对于这样的简单爬虫 x
  • 第一节 请求与响应

    请求 由客户端发往服务器 xff0c 分为四个部分 xff1a 请求头 xff0c 请求方法 xff0c 请求网址URL 请求体 当我们在浏览器中输入一个网址或点击一个链接时 xff0c 浏览器会向服务器发送请求 xff0c 请求获取指定的
  • 第二节 Web网页基础

    网页的组成 网页需要通过 HTML CSS JavaScript 和各种媒体资源的组合 xff0c 实现多种功能和呈现效果的页面 一个网页通常由以下几个组成部分构成 xff1a HTML标记语言 xff1a 定义网页的结构 内容和格式 xf
  • 第三节 爬虫基本原理

    爬虫概述 爬虫是指通过程序自动化地获取互联网上的信息 xff0c 从而达到快速 大量地获取数据的目的 Python语言有着丰富的爬虫库和框架 xff0c 因此成为了编写爬虫程序的主流语言之一 Python写爬虫的优势 xff1a 语法简洁

随机推荐

  • 第四节 Session和Cookie

    静态页面和动态页面 静态页面是指服务器上存储的固定页面 xff0c 每次用户访问时返回的内容都是一样的 xff0c 内容不会根据用户的操作或者其他因素发生改变 静态页面通常由 HTML CSS 和 JavaScript 等静态文件组成 xf
  • 案例四 ajax动态加载页面数据爬虫

    需求 xff1a 爬取https spa3 scrape center 电影名称 xff0c 电影分类 xff0c 上映时间和评分 接口分析 直接在浏览器请求https spa3 scrape center xff0c 并查询网页源码 xf
  • python数据持久化总结

    数据持久化 数据持久化通常指将数据保存到磁盘或其他永久存储介质中以便以后使用 以下是一些在Python中进行数据持久化的常用方法 xff1a 文件操作 xff1a 可以使用Python内置的文件操作来将数据保存到文本文件中 xff0c 例如
  • MongoDB查询综合

    数据库操作 选择数据库 use lt 数据库名 gt 展示当前所在数据库 db 在选择数据库后 xff0c 可以进行该数据库的相关操作 xff0c 例如创建集合 插入文档等 查询语法 查询全部文档 db lt 集合名 gt find 指定条
  • c++如何编译

    include lt iostream gt 预处理指令 xff0c include是找一个文件 xff0c 一般引出头文件 int main main函数不用从主函数返回任何数据 std cout lt lt 34 Hello World
  • 在DAX进行字符串大小比较

    昨天看到一个人在论坛上上求助 xff0c 想找一个方法按照一定要求对数据进行分类 分类要求是查找原始数据中的BU Type隶属于分类依据中的哪个区间 xff0c 然后输出该区间对应的Identifier值 其中AA ZZ区间指的是所有两位字
  • Modbus协议的数据模型和地址模型,Modbus寄存器40001,30001是什么意思?

    在使用Modbus协议的时候 xff0c 经常会遇到诸如40001 30001 xff0c 10001之类的地址 xff0c 这些数字代表什么含义呢 xff1f 这其实是Modbus协议的数据模型和地址模型 Modbus协议的数据模型 数据
  • 如何看懂Modbus数据帧?Modbus RTU数据帧格式

    在介绍Modbus RTU数据帧格式之前 xff0c 首先让我们先了解一下Modbus的通讯模式 Modbus通讯模式 Modbus协议是典型的主 从通讯结构 xff0c 链路中只能有一台主设备 xff0c 可以有多台从设备 主设备向从设备
  • 网络安全,非对称加密,对称加密和非对称加密的区别

    当今世界 xff0c 网络安全问题比以往任何时候都更需认真对待 本文是属于 网络安全 系列文章之一 xff0c 我们将详细阐述了安全性的基础知识 在本文中 xff0c 我们将阐述非对称加密的原理 xff0c 这是确保真实性 完整性和保密性的
  • Modbus的常见问题解答:RS485总线连接采用什么样的线缆?RS485总线为什么要采用手拉手结构?RS485总线在连接时为什么要屏蔽接地?什么叫共模干扰和差模干扰?如何消除通讯线上的干扰?

    RS485总线连接采用什么样的线缆呢 xff1f 必须采用国际上通行的屏蔽双绞线 推荐用屏蔽双绞线的型号为RVSP2 0 5 xff08 二芯屏蔽双绞线 xff0c 每芯由16 股的0 2mm的导线组成 xff09 xff0c 线材特性阻抗
  • 积跬步,至千里 | 详解NP40芯片的三个节能「小举措」

    2023 年世界地球日的主题为 携手为保护地球投资 xff08 Invest in our planet xff09 xff0c 旨在呼吁每个人都能采取实际行动去投资地球的未来 相信无论您身处何处 xff0c 都已经感受到了全球极端天气的日
  • 如何快速替换PROFINET故障设备

    最近有些客户向我们咨询一个问题 xff1a 他们生产出售的 PROFINET 从站产品可能会在客户的应用现场被损坏 xff0c 需要更换全新的产品进行替换 客户询问我们是否有一种快速替换现场损坏设备的方法 除了调试客户 PROFINET 设
  • GPS固定数据输出语句($GPGGA)

    GPGGA GPS固定数据输出语句 GPGGA 这是一帧GPS定位的主要数据 xff0c 也是使用最广的数据 GPGGA 语句包括17个字段 xff1a 语句标识头 xff0c 世界时间 xff0c 纬度 xff0c 纬度半球 xff0c
  • 年度必看 | 2023全球工业网络市场份额预测报告

    重点摘要 每年 xff0c HMS Networks 都会对工业网络市场进行分析 xff0c 以预测工厂自动化中新安装节点的分布情况 今年的研究显示 xff0c 整个工业网络市场预计将在 2023 年增长 7 工业以太网仍然保持最高增长 x
  • 如何使用VSCode编译调试C语言程序

    一 前言 Visual Studio Code可通过安装插件来支持C 43 43 C Python PHP等语言 xff0c 使用的工程师越来越多 xff0c 本文介绍如何使用VS Code进行C语言的编译与调试 二 安装VS Code V
  • 修改一个工作空间中的工程文件目录结构

    如果有两个工程 xff0c Test1 Test2 xff0c 那么 默认目录结构的是 Test1 dsw Test1 dsp Test2 Test2 dsp 这个结构不太清晰 xff0c 用过vc7或更高的朋友知道 xff0c 他们的目录
  • C语言50题之百度笔试题

    判断你的电脑存储方式是大端还是小端 大端模式 xff0c 是指数据的高字节保存在内存的低地址中 xff0c 而数据的低字节保存在内存的高地址中 xff0c 这样的存储模式有点儿类似于把数据当作字符串顺序处理 xff1a 地址由小向大增加 x
  • 关于C语言中return的总结

    return break和continue 这三个关键字有一个共同点 xff0c 那就是读能让后面的语句不执行 xff0c 不同的地方就是挑的距离不一样 return很强大 xff0c 如果一个函数中有一个return xff0c 并且执行
  • Windows下Cmake的简单使用

    一 安装Cmake 官网 xff1a https cmake org 本文以Windows64为例 二 项目目录如下 xff1a 1 新建demo文件夹 2 在demo文件夹下新建bin文件夹 HelloWorld cpp CMakeLis
  • Cmake的动态链接库dll的生成并测试

    一 项目任务 1 完成一个CMake工程生成一个动态库 xff0c 该动态库包含内容 xff1a 1 包含一个StringUtil类 xff0c 该类具有Split和Trim2个静态方法 上述2个接口的定义如下 xff1a 删除字符串两侧的