C++中declspec(dllexport)和declspec(dllimport) 的用法介绍

一、创建动态文件

1.添加头文件dll.h,并输入以下代码:

#ifdef DLL_EXPORTS                        //如果在工程里已经添加预定义宏DLL_EXPORTS
#define DLLEXPORT __declspec(dllexport)   //那DLLEXPORT就指代__declspec(dllexport) 用于dll的导出
#else                                     //当工程中不包含DLL_EXPORTS预定义时
#define DLLEXPORT __declspec(dllimport)   //DLLEXPORT 就指代__declspec(dllimport)
#endif

DLLEXPORT int add(int a, int b);//导出函数用
DLLEXPORT void foo();//导出函数用
class DLLEXPORT  __declspec(dllexport) a {};//导出类用 

2.在项目的属性中的预处理其中定义DLL_EXPORTS,其他项目则不要定义。

3.在dll.cpp文件中实现方法:

#include "dll.h"

int add(int x,int y)
{
    return x+y;
}

4.编译生成,则工程的debug目录下就生成了.dll和.lib文件

二、创建调用动态文件

1.新工程中,创建添加源文件calldll.cpp,并输入以下代码:

#include "dll.h"
#include <iostream>

int main()
{
    int z;
    int x=1, y=2;
    z=add(x,y);
    std::cout<<z<<std::endl;
}

2.工程属性进行以下设置:

(1)C/C++:“附加包含目录”,添加dll.h头文件目录;

(2)链接器--常规: “附加库目录”,添加上面生成的dll.lib文件的目录;

(3)链接器--输入:“附加依赖项”,添加上面生成的dll.lib文件。

(4)代码中开始位置手动引用静态库: #pragma comment(lib,"..\Testlib\Test.lib")

注:#pragma comment(lib,"..\upgradeLib\RKUpgrade.lib")

3.按照如上操作,即可成功生成并运行。即完成dll动态库的调用。

注:

如果编译通过后用行,提示丢失dll.dll文件的错误信息。
解决:将dll.dll放在和exe同一目录下或放在c:\windows\system32目录下(Win64位操作系统且dll.dll不是64位而是32位的话放在c:\windows\syswow64目录下)

到此这篇关于C++中declspec(dllexport)和declspec(dllimport) 用法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • C++ assert()函数用法案例详解

    1. 简介 assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行. 原型定义: #include <assert.h> void assert( int expression ); assert的作用是先计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行.请看下面的程序清单badptr.c: #include <stdio.h> #incl

  • c++ 中__declspec 的用法详解

    c++ 中__declspec 的用法如下,想要了解的继续往下看吧. 语法说明: __declspec ( extended-decl-modifier-seq ) 扩展修饰符: 1:align(#) 用__declspec(align(#))精确控制用户自定数据的对齐方式 ,#是对齐值. e.g __declspec(align(32)) struct Str1{ int a, b, c, d, e; }; 它与#pragma pack()是一对兄弟,前者规定了对齐的最小值,后者规定了对齐的最

  • C++中replace() 函数的基本用法

    目录 replace算法: 用法一:用str替换指定字符串从起始位置pos开始长度为len的字符 用法二: 用str替换 迭代器起始位置 和 结束位置 的字符 用法三: 用substr的指定子串(给定起始位置和长度)替换从指定位置上的字符串  用法四:string转char*时编译器可能会报出警告,不建议这样做 用法五:string转char*时编译器可能会报出警告,不建议这样做 用法六:string转char*时编译器可能会报出警告,不建议这样做 用法七:string转char*时编译器可能会

  • C++ push_back()函数使用详解

    最近在学习Opencv,用C++写程序,做了一个虚拟画笔的项目,即通过摄像头采集视频图像信息,识别视频中的画笔,并画笔在空中的划痕显示在视频图像上.在进行到划痕显示的,由于视频是实时采集的,检测到的画笔位置坐标会不断更新,但是现在需要将划痕留在视频图像上. 经过查阅,push_back()函数可以实现这个功能,首先他存在于vector头文件中,显然和vector有关,其功能是为指定vector容器尾部添加数据,并且该vector的容量随压入数据不断扩大,新压入数据和旧数据共存不会溢出.为了更加形

  • C++中cin.getline()和getline()函数的区别小结

    前言 C++输入过程中,是把输入加载到缓冲区中,然后对缓冲区中的字符进行读取.cin,cin.get(),cin.getline()三个函数虽然都可以进行舒服读取,但是它们对缓冲区内的数据处理方法是不同的(如遇到[space].[enter]的处理方法).本文简单介绍cin.getline()和getline()函数的区别. cin.getline(): 用法:接收一个字符串,可以接收空格并输出,需包含#include< cstring > char m[20]; cin.getline(m,

  • C++ move()函数案例详解

    要了解move函数首先弄清左值引用和右值引用. 左值.左值引用.右值.右值引用 1.左值和右值的概念         左值是可以放在赋值号左边可以被赋值的值:左值必须要在内存中有实体:         右值当在赋值号右边取出值赋给其他变量的值:右值可以在内存也可以在CPU寄存器.         一个对象被用作右值时,使用的是它的内容(值),被当作左值时,使用的是它的地址. 2.引用         引用是C++语法做的优化,引用的本质还是靠指针来实现的.引用相当于变量的别名.        

  • C/C++ 中memset() 函数详解及其作用介绍

    memset 函数是内存赋值函数,用来给某一块内存空间进行赋值的: 包含在<string.h>头文件中,可以用它对一片内存空间逐字节进行初始化: 原型为 : void *memset(void *s, int v, size_t n); 这里s可以是数组名,也可以是指向某一内在空间的指针: v为要填充的值: n为要填充的字节数: 例子: struct data { char num[100]; char name[100]; int n; }; struct data a, b[10]; me

  • C++中友元函数(friend)解析

     文章转自公众号:Coder梁(ID:Coder_LT) 我们知道C++控制对象的私有部分的访问,只能通过公共的接口.这样的设计当然没错,但有的时候也会显得过于严格,产生一些问题. 因此C++提供了另外一种形式的访问权限,叫做友元(friend). 友元有三种,分别是友元函数.友元类和友元成员函数. 通过让函数成为类的友元,可以赋予该函数与类成员函数一样的访问权限,也就是说我们可以在友元函数当中访问类的私有成员变量. 在介绍友元函数的使用之前,我们需要先了解为什么需要友元函数.C++ Prime

  • C++ Invalidaterect()函数作用案例详解

    函数原型: BOOLInvalidateRect( HWND hWnd, // handle of window withchanged update region 窗口句柄. CONST RECT *lpRect, // address ofrectangle coordinates rect结构体的指针. BOOL bErase // erase-background flag 是否要发送WM_ERASEBKGND消息从而擦除原来的背景 ); 这个函数的作用是,使得Client的一个矩形区域

  • C++中declspec(dllexport)和declspec(dllimport) 的用法介绍

    一.创建动态文件 1.添加头文件dll.h,并输入以下代码: #ifdef DLL_EXPORTS //如果在工程里已经添加预定义宏DLL_EXPORTS #define DLLEXPORT __declspec(dllexport) //那DLLEXPORT就指代__declspec(dllexport) 用于dll的导出 #else //当工程中不包含DLL_EXPORTS预定义时 #define DLLEXPORT __declspec(dllimport) //DLLEXPORT 就指代

  • C#中Trim()、TrimStart()、TrimEnd()的用法介绍

    C#中Trim().TrimStart().TrimEnd()的用法:这三个方法用于删除字符串头尾出现的某些字符.Trim()删除字符串头部及尾部出现的空格,删除的过程为从外到内,直到碰到一个非空格的字符为止,所以不管前后有多少个连续的空格都会被删除掉.TrimStart()只删除字符串的头部的空格.TrimEnd()只删除字符串尾部的空格.如果这三个函数带上字符型数组的参数,则是删除字符型数组中出现的任意字符.如Trim("abcd".ToCharArray())就是删除字符串头部及

  • C#中的三种定时计时器Timer用法介绍

    在.NET中有三种计时器: 1.System.Windows.Forms命名空间下的Timer控件,它直接继承自Componet.Timer控件只有绑定了Tick事件和设置Enabled=True后才会自动计时,停止计时可以用Stop()方法控制,通过Stop()停止之后,如果想重新计时,可以用Start()方法来启动计时器.Timer控件和它所在的Form属于同一个线程: 2.System.Timers命名空间下的Timer类.System.Timers.Timer类:定义一个System.T

  • python 中defaultdict()对字典进行初始化的用法介绍

    目录 用法讲解: 1. 不使用defaultdict(): 2. 使用defaultdict(): 用法讲解: 一般情况下,在使用字典时,先定义一个空字典(如dict_a = {}),然后往字典中添加元素只需要 dict_a[key] = value即可.读取字典中的元素时同理,但前提时字典中存在这个key,否则就会报错. 而defaultdict()的作用在于,即使字典中的key不存在,在查找时也会对它的value赋予一个默认值,从而避免了报错. 具体来说,defaultdict接受一个工厂函

  • C#中const,readonly和static关键字的用法介绍

    如果有一个值不太会变化,我们经常使用const和readonly,这2者有何不同呢?有时候,我们也会在readonly之前加上关键字static,这又意味着什么呢? const const默认是静态的,可以通过"类名.字段名"来访问. const变量只能在声明的时候赋值,不能在构造函数中为const类型变量赋值. 一旦程序集被编译,const变量会被写进程序集的IL代码中.如果想修改const变量值,必须在修改值后再重新生成程序集. const是编译期变量 public class T

  • 正则表达式中test、exec、match的区别介绍及括号的用法

    test.exec.match的简单区别 1.test test 返回 Boolean,查找对应的字符串中是否存在模式. var str = "1a1b1c"; var reg = new RegExp("1.", ""); alert(reg.test(str)); // true 2.exec exec 查找并返回当前的匹配结果,并以数组的形式返回. var str = "1a1b1c"; var reg = new Re

  • oracle中length、lengthb、substr、substrb函数用法介绍

    我记得我曾经在开发form的时候犯过这样一个错误,对于form中的某个字段,对应于数据库中某张表的字段,假设在数据库中这个字段一般也就用到20个汉字的长度,后来我在开发form的时候,设置item类型长度的时候,我惯性的设置成了50byte,想着就算是20个汉字,最多也就占40个byte长度嘛.可是,就因为这一个想当然,结果出现错误了,后来发现数据库字符集编码是utf8,那么应该设置为60.从那以后,每次涉及到给字段设置长度的时候,我都会特别注意下,到底是啥编码. 在oracle中,比较常见的可

  • JSP中Servlet的Request与Response的用法与区别

    JSP中Servlet的Request与Response的用法与区别 简介:Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要获取客户机提交过来的数据,只需要找request对象就行了.要向客户机输出数据,只需要找response对象就行了. 一,Request Request代表请求对象,其中封装了对请求中具有请求行.请求头.实体内容的操作的方法

  • winform中的ListBox和ComboBox绑定数据用法实例

    本文实例讲述了winform中的ListBox和ComboBox绑定数据用法.分享给大家供大家参考.具体实现方法如下: 本例实现将集合数据绑定到ListBox和ComboBox控件,界面上显示某个属性的内容,代码如下: 复制代码 代码如下: //... //自定义了Person类(有Name,Age,Heigth等属性) List<Person> persons=new List<Person>(); persons.Add(new Person("WuMiao"

  • JS中的Replace()传入函数时的用法详解

    replace方法的语法是:stringObj.replace(rgExp, replaceText) 其中stringObj是字符串(string),reExp可以是正则表达式对象(RegExp)也可以是字符串(string),replaceText是替代查找到的字符串.. 废话不多说了,直接给大家贴代码了,具体代码如下所示: <script> var str = "a1ba2b"; var reg = /a.b/g; str = str.replace(reg,func

随机推荐