创建自己的动态库及如何链接

来源:互联网 发布:数组一般什么时候用 编辑:程序博客网 时间:2024/04/28 10:21

1、 DLL的概念

DLL(Dynamic Linkable Library),动态链接库,可以向程序提供一些函数、变量或类。这些可以直接拿来使用。

静态链接库与动态链接库的区别:

(1)静态链接库与动态链接库都是共享代码的方式。静态链接库把最后的指令都包含在最终生成的EXE文件中了;动态链接库不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。

 

(2)静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。

 (3) 在使用动态库的时候,往往提供两个文件:一个引入库文件.lib,一个.dll文件。引入库文件包含DLL导出的函数和变量的符号名,而.dll包含实际的函数和数据。在使用动态库的情况下,在编译链接可执行文件时,只需要链接.lib引入库文件,该DLL中的函数代码和数据并不复制到.exe中,直到执行时才去加载所需的DLL,将该DLL映射到进程的地址空间中,然后访问DLL中导出函数。

创建DLL项目

  新建项目:visual c++->win32->win32控制台应用程序

  项目名称:MyDLL->确定->下一步->DLL(附加选项 对空项目打钩)->完成

解决方案里出现新建立的MyDLL项目:

 1、新两个文件MyDLL.cpp,MyDLL.h

// mydll.cpp : 定义 DLL 应用程序的导出函数。
//
#include "stdafx.h"
#include "mydll.h"
int Add(int & a,int & b)
{
return a + b;
}
extern "C" cc_dll int Sub(int & a,int & b)
{
return a - b;
}
Data::Data(int _data)
{
m_data=_data;
}
int Data::getData()
{
return m_data;
}
void Data::setData(int _data)
{
m_data=_data;
}

//为了让DLL导出一些函数,需要在每个将要导出的函数前面添加标识符__declspec(dllexport) 

其中 extern “C”为声明为C编译。由于C++编译器在编译的时候会造成其函数名的该变,在其他应用程序中导致函数不可调用,而C编译器则不会在编译后改变其函数名。

-----MyDLL.h

#pragma once 
#ifndef cc_dll
#define cc_dll __declspec(dllexport)
#endif
extern "C" cc_dll int Add(int & a,int & b);


class cc_dll Data
{
public:
Data(int _data);
int getData();
void setData(int _data);
private:
int m_data;
};


2、建立测试项目

 新建项目:visual c++->win32->win32控制台应用程序

静态调用(隐式动态链接)

将生成的.dll和.lib文件拷入到调用dll的工程中,用命令

#pragma comment(lib,"MyDLL.lib"),实现静态调用,即把该dll的引入库.lib也编译到exe文件中去。

--TestDLL.cpp : 定义控制台应用程序的入口点。
// test_dll.cpp : 定义控制台应用程序的入口点。
//


#include "stdafx.h"
#include "iostream"
using namespace std;
#pragma comment(lib,"MyDLL.lib")
#ifndef DLL_API
#define DLL_API  _declspec(dllimport)//_declspec(dllimport) 表明函数是从动态链接库中引入的
#endif
extern "C" DLL_API int Add(int &a,int &b);
extern "C" DLL_API int Sub(int &a,int &b);
extern "C" DLL_API class Data
{
public:
Data(int _data);
int getData();
void setData(int _data);
private:
int m_data;
};


int _tmain(int argc, _TCHAR* argv[])
{
int a=13;
    int b=14;
Data _Data(0);
    cout<<"a+b="<<Add(a,b)<<endl;
    cout<<"a-b="<<Sub(a,b)<<endl;
cout<<_Data.getData()<<endl;
_Data.setData(100);
cout<<_Data.getData()<<endl;
    getchar(); 
return 0;


}


3、配制测试项目:选中项目,右键

项目->属性->配置属性->VC++ 目录-> 包含目录里编辑添加头文件MyDLL.h所在的目录 

项目->属性->配置属性->VC++ 目录-> 库目录里编辑添加库文件MyDLL.lib所在的目录 


项目->属性->配置属性->链接器->输入-> 附加依赖项里编辑添加“MyDLL.lib”


4、将MyDLL.dll复制到生成的TestDLL.exe目录下。

DLL动态链接库:lib为动态链接库的引导库,项目对会先复制一份,在生成.exe。但.dll项目不会复制一份在生成.exe目录下,需要手动拷贝。

二 导出类

在dll中定义:
在定义的时候用 class _declspec(dllexport) classname{
}
在类中引用的时候用
加入类定义头文件:#include “classname.h”
Class _declspec(dllimport) classname; 来导入类

0 0
原创粉丝点击