c++动态库调用的实现

目录
  • 一、生成dll
  • 二、调用dll

在平时的开发中某些情况,动态库和静态库是程序开发的不二法门,例如封装一个库,供别人调用(日志库、字符串处理库、设备信息采集库等),比如接入第三方系统或者平台,等等是非常重要的,笔者最早接触的MFC时就有dll(VC++深入详解)及鸡啄米的MFC环节,后面随着QT的盛行(国产化的推进),QT开始广泛应用,里面也有动态库,就笔者最近的项目为例,这里记录下从库的生成到最后的调用;

一、生成dll

1.安装vs开发工具(2017);

2.新建c++ dll 工程;

3.实现.h和.cpp,将新建默认的.h和.cpp移除;

OSCommonDefine.h

#ifndef __BASE_OSCOMMONDEFINE_H__
#define __BASE_OSCOMMONDEFINE_H__

#define AT_DLLEXPORT __declspec(dllexport)

#endif // __BASE_OSCOMMONDEFINE_H__

CStringUtils.h

//-----------------------------------------------------------------------------
// Copyright (c) 2022, xxx
// All rights reserved.
//
// 摘要: CStringUtils.h 字符串工具类声明
// 当前版本: 1.0
// 作者: Zhang Lei
// 日期:2022.06.28
// 版本说明:类初始版本实现
//-----------------------------------------------------------------------------

#ifndef __BASE_CSTRINGUTILS_H__
#define __BASE_CSTRINGUTILS_H__

#include "OSCommonDefine.h"
#include <string>
#include <vector>
using namespace std;

// CStringUtils类定义
class AT_DLLEXPORT CStringUtils
{
public:
    // 字符串转大写
    static string& ToUpper(string& strContent);
    // 字符串转小写
    static string& ToLower(string& strContent);
    // 字符串忽略大小写比较
    static int CompareNoCase(const string& strContent, const string& strContentCmp);
};

#endif // __BASE_CSTRINGUTILS_H__

CStringUtils.cpp

//-----------------------------------------------------------------------------
// Copyright (c) 2022, xxx
// All rights reserved.
//
// 摘要: CStringUtils.h 字符串工具类声明
// 当前版本: 1.0
// 作者: Zhang Lei
// 日期:2022.06.28
// 版本说明:类初始版本实现
//-----------------------------------------------------------------------------

#include <string>
#include <algorithm>
#include "../../include/CStringUtils.h"
using namespace std;

//-----------------------------------------------------------------------------
// 功能: 字符串转大写
// 参数:
// strContent: 待转的字符串
// 返回值: 返回转换后字符串的引用对象
// 创建者: Zhang Lei
// 日期:2022.06.28
//-----------------------------------------------------------------------------
string& CStringUtils::ToUpper(string& strContent)
{
    transform(strContent.begin(), strContent.end(), strContent.begin(), ::toupper);
    return strContent;
}

//-----------------------------------------------------------------------------
// 功能: 字符串转小写
// 参数:
// strContent: 待转的字符串
// 返回值: 返回转换后字符串的引用对象
// 创建者: Zhang Lei
// 日期:2022.06.28
//-----------------------------------------------------------------------------
string& CStringUtils::ToLower(string& strContent)
{
    transform(strContent.begin(), strContent.end(), strContent.begin(), ::tolower);
    return strContent;
}

//-----------------------------------------------------------------------------
// 功能: 字符串忽略大小写比较
// 参数: strContent 字符串 strContentCmp 比较的字符串
// 返回值: 比较结果
// 创建者: 2022.06.28
// 创建日期: 2022.06.28
//-----------------------------------------------------------------------------
int CStringUtils::CompareNoCase(const string& strContent, const string& strContentCmp)
{
#if defined(_WIN32)
    return _stricmp(strContent.c_str(), strContentCmp.c_str());
#elif defined(__linux__)
    return strcasecmp(strContent.c_str(), strContentCmp.c_str());
#endif
}

4.生成dll,编译报错;

去掉预编译头

成功

5.说明:

一般要将.h和.cpp分开,毕竟.h是对外调用的,要和管理;

二、调用dll

1.新建测试程序,这里新建一个控制台应用程序;

2.调用:

#include <iostream>
#include "../../include/CStringUtils.h"

int main()
{
	std::string str = "I love China";

	std::cout << "Hello World!\n";
	std::cout << CStringUtils::ToUpper(str) << std::endl;
	std::cout << CStringUtils::ToLower(str) << std::endl;
}

在工程中设置调用库名和路径:

4.成功输出:

到此这篇关于c++动态库调用的实现的文章就介绍到这了,更多相关c++动态库调用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++ DLL动态库的创建与调用(类库,隐式调用)

    目录 1.创建库工程 2.添加头文件 3.添加cpp文件 4.编译dll工程 5.创建调用工程 6.调用工程 添加cpp文件 1.创建库工程 2.添加头文件 ClassDll.h // 宏定义 防止.h文件重复编译 #ifndef _DLLCLASS_H #define _DLLCLASS_H // dll库文件 定义 宏(DLLCLASS_EXPORTS) 使用 _declspec(dllexport) // 使用dll库文件时 _declspec(dllimport)(不定义宏就行) #if

  • c++实现加载so动态库中的资源

    实例如下: #include <stdio.h> #include <dlfcn.h> #include <stdlib.h> #include <iostream> //编译命令 g++ -m32 EncodeOrDecode.cpp -ldl -o edcode //名字通过nm -D xxxxxx.so获取 using namespace std; int main(int argc,char **argv){ void *handle = dlope

  • 详解C++ 动态库导出函数名乱码及解决

    刚接触C++,在尝试从 dll 中导出函数时,发现导出的函数名都"乱码"了. 导出过程如下: 新建一个Win32项目: 新建的解决方案里有几个导出的示例: // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法.此 DLL 中的所有文件都是用命令行上定义的 DLLEXPORT_EXPORTS // 符号编译的.在使用此 DLL 的 // 任何其他项目上不应定义此符号.这样,源文件中包含此文件的任何其他项目都会将 // DLLEXPORT_API 函数视为是从 D

  • C++ Cmake的构建静态库和动态库详解

    目录 静态库和动态库的区别 构建示例 ADD_LIBRARY 同时构建静态和动态库 SET_TARGET_PROPERTIES 动态库的版本号 安装共享库和头文件 使用外部共享库和头文件 解决 :make后头文件找不到的问题 解决:找到引用的函数问题 特殊的环境变量CMAKE_INCLUDE_PATH和CMAKE_LIBRARY_PATH 总结 静态库和动态库的区别 1.静态库的扩展名一般为".a"或者".lib":动态库的扩展名一般为".so"

  • VisualStudio2019构建C/C++静态库和动态库dll的问题 附源码

    1. 静态库和动态库 1.1. 静态链接库 举个例子,假如你在编写一个C++工程,根据业务逻辑,这个工程需要用到一些工具类,例如集合操作的工具类(暂且叫他collection_utils),于是你直接定义一个collection_utils.h头文件和一个collection_utils.cpp文件,在头文件中写一些工具函数的定义,在cpp文件中写函数的实现逻辑:如下所示: //---------------collection_utils.h--------------------------

  • c++动态库调用的实现

    目录 一.生成dll 二.调用dll 在平时的开发中某些情况,动态库和静态库是程序开发的不二法门,例如封装一个库,供别人调用(日志库.字符串处理库.设备信息采集库等),比如接入第三方系统或者平台,等等是非常重要的,笔者最早接触的MFC时就有dll(VC++深入详解)及鸡啄米的MFC环节,后面随着QT的盛行(国产化的推进),QT开始广泛应用,里面也有动态库,就笔者最近的项目为例,这里记录下从库的生成到最后的调用: 一.生成dll 1.安装vs开发工具(2017): 2.新建c++ dll 工程:

  • Qt动态库调用宿主进程中的对象方法纯虚函数使用

    目录 引言 在运行时加载动态库并获取对象指针(QLibrary) 本贴重点:在动态库中调用宿主进程的对象方法 还是以add方法为例写一个Demo 引言 可执行程序加载动态库并调用动态库导出的函数是比较容易的: 导入库对应的头文件 在CPP文件中调用函数 在链接程序时加上动态库作为参数 假设demo.cpp中需要用到动态库libadd.so中的某个函数,可能是int add(int x, int y),那么我们编译时就需要链接上libadd.so, gcc参数中-L./libs指定了当前目录下的l

  • 动态库调用静态库示例讲解

    生成动态库: 需要的目标文件得用-fPIC选项生成. 而静态库所需的目标文件可以不用-fPIC选项. 例: 复制代码 代码如下: /////// static.h void static_print(); ///////static.cpp #include <iostream> #include "static.h" void static_print() { std::cout<<"This is static_print function&quo

  • 如何使用python的ctypes调用医保中心的dll动态库下载医保中心的账单

    需求:根据医保中心的文档和提供的dll动态库调用相关接口下载医保中心的账单. 文档:对调用dll动态库的描述,调用哪个dll文件,同时了解清楚调用这个dll文件中的哪个函数. 分析:结合文档及相关介绍弄清楚相关接口调用流程,从以上可以看出接口调用的是SiInterface.dll文件,然后先调用INIT函数进行初始化,然后再调用BUSINESS_HANDLE函数在医保局签到,然后在次调用BUSINESS_HANDLE函数下载账单,同时根据文档分析出每次调用函数的出入参.(具体的调用流程及每个函数

  • 分析Windows和Linux动态库

    摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理.但不同操作系统的动态库由于格式 不同,在需要不同操作系统调用时需要进行动态库程序移植.本文分析和比较了两种操作系统动态库技术,并给出了将Visual C++编制的动态库移植到Linux上的方法和经验. 1.引言 动态库(Dynamic Link Library abbr,DLL)技术是程序设计中经常采用的技术.

  • 详解dll动态库的开发与调用及文件的读写小程序

    详解dll动态库的开发与调用及文件的读写小程序 首先我们先来学习一下动态库的调用,先找到动态库的.dll和.lib文件并将其导入到同源文件相同级别的文件夹下面,然后在添加进其头文件,并右击项目处,然后点击链接,链接我们的lib文件(一定要是全名称包括扩展名),然后我们就可以调用动态库的函数了. Dll是我们具体的函数, lib使我们的函数描述文件. #include <stdio.h> #include <stdlib.h> /* 该代码是对文件读写操作的使用 */ #pragma

  • C#调用非托管动态库中的函数方法

    C#如何调用一个非托管动态库中的函数呢,比如用VC6写的动态库,总之C#调用动态库的过程是比Java调用DLL动态库方便快捷多了,下面举例说明这个过程. 1.创建一个非托管动态库 代码如下: 复制代码 代码如下: //这一句是声明动态库输出一个可供外不调用的函数原型.     extern   "C"  __declspec(dllexport)  int  add( int ,  int ); int  add( int  a, int  b)      {          //实

  • Java通过调用C/C++实现的DLL动态库——JNI的方法

    由于项目的需要,最近研究了java 调用DLL的方法,将如何调用的写于此,便于日后查阅: 采用的方法是JNI: Java Native Interface,简称JNI,是Java平台的一部分,可用于让Java和其他语言编写的代码进行交互. 下面是从网上摘取的JNI工作示意图: 总体说明:先在JAVA中建立一个类,通过javac生成.class,再由javah生成.h:然后将.h复制到VC下,由VC实现具体函, 并编译通过后生成DLL,将DLL放入JAVA工程中使用,完毕. 下面说说具体步骤(含实

  • linux中使用boost.python调用c++动态库的方法

    前言 最近开始使用 robot framework 测试c++的动态库,robot framework 是跑在 windows 上面,c++动态库是跑在远程linux主机上面.测试办法是让 robot framework 通过 SSHLIbrary 库执行远程机器上面的 python 脚本,python 脚本调用 C++ 动态库.所以现在要解决的是如何让python调用c++动态库. python调用c++动态库的两种办法 在上网查资料和咨询同事之后,得到两种办法:第一种将C++动态库封装成C接

  • Python调用.net动态库实现过程解析

    pythonnet简介 pythonnet是cpython的扩展 pythonnet提供了cpython和.net程序集之间交互的桥梁 pythonnet开源在github上 pythonnet安装 通过pip install pythonnet安装 pythonnet的使用帮助 pythonnet的使用帮助,请参见github. pythonnet中的坑 cpython是分32和64位的,对应的pythonnet也是分的,版本要对应好 pythonnet最核心的就是python.Runtime

随机推荐