创建编译库文件有个好处就是不容易被修改,加密的,方便调用,但是缺点是不容易查看其中的内容,反编译比较麻烦。下面让我们使用VC创建编译自己的库文件吧。常用的函数,不常更改的,应该放到库文件里,所以库文件的意义非比寻常。但为了(这里需要明白C++库和C++组件(COM组件)、插件OCX的区别) DLL与COM面试问题        DLL和插件的相关性        插件是使用了某种规则的DLL       给自己的程序添加插件功能dll做插件         DLL插件设计思想       使用DLL作为插件的设计框架        插件开发(Java)          基于插件式的开发框架            插件技术(Android)

dll库中主要是一个函数,当然还有类和变量这些辅助对象,其主要目的是为了实现某个特定的功能,可以由任意程序调用。这跟静态库不同。

dll与lib的区别:lib是在编译时和可执行程序打包到一起的,外部看不到它的存在,它在exe里面,所以如果丢失了dll它依然可以运行。它是静态链接库,是目标对象obj的集合。而dll在导出时,有时没有lib文件,有时有lib文件,而存在的这种lib文件就是导出文件,到出库。这样的lib,导入文件,包含DLL导出的函数和变量的符号名,而真正的函数的实现和数据存在于DLL。lib占用内存,dll只用用时才占用内存

举个例子:

__declspec(dllexport)

声明一个导出函数,是说这个函数要从本DLL导出。我要给别人用。一般用于dll中省掉在DEF文件中手工定义导出哪些函数的一个方法。当然,如果你的DLL里全是C++的类的话,你无法在DEF里指定导出的函数,只能用__declspec(dllexport)导出类。

__declspec(dllimport)

声明一个导入函数,是说这个函数是从别的DLL导入。我要用。一般用于使用某个dll的exe中不使用__declspec(dllimport)也能正确编译代码,但使用__declspec(dllimport)使编译器可以生成更好的代码。编译器之所以能够生成更好的代码,是因为它可以确定函数是否存在于DLL中,这使得编译器可以生成跳过间接寻址级别的代码,而这些代码通常会出现在跨DLL边界的函数调用中。但是,必须使用__declspec(dllimport)才能导入DLL中使用的变量。

为什么叫导入文件,就是把Dll中导出的函数,类给导入到我们自己的应用程序中使用。

使用方法:1、静态链接库(lib),我们使用隐式链接; 2、动态链接库(DLL),不包含lib导入文件,我们用显式链接。但是这样会很麻烦,我不喜欢这样用,我会想尽方法让它带有lib文件。 3、动态链接库(DLL),包含lib导入文件,我们使用 隐式链接。

1. 新建-->项目-->Win32 Console-->勾选dll-->确定。

2. MyDll.h头文件声明

  1. #ifdef MYDLL_EXPORTS
  2. #define MYDLL_API __declspec(dllexport) //定义MYDLL_API为导出类型
  3. #else
  4. #define MYDLL_API __declspec(dllimport)
  5. #endif
  6.  
  7. // This class is exported from the MyDll.dll 该类从MyDll.dll中导出
  8. class MYDLL_API CMyDll {
  9. public:
  10. CMyDll(void);
  11. CMyDll(int _age, char *_name); //年龄和姓名 构造函数
  12. ~CMyDll();
  13. // TODO: add your methods here.
  14. void Introduce(); //介绍函数
  15. static void SayStatic();
  16. private:
  17. int age;
  18. char* name;
  19. static int a;
  20. };

extern MYDLL_API int nMyDll;//导出全局变量的声明
  extern MYDLL_API float f;
  extern MYDLL_API int a;

  1. MYDLL_API int fnMyDll(void); //导出全局函数的声明
    MYDLL_API void SayHell();
  1.  

3. MyDll.cpp文件的函数和类的实现

  1. #include "stdafx.h"
  2. #include "MyDll.h"
  3. #include <iostream>
  4. #include <string.h>
  5. #include <algorithm>
  6. using namespace std;
  7.  
  8. // This is an example of an exported variable
  9. MYDLL_API int nMyDll=;
  10. MYDLL_API float f = 3.14;
  11. MYDLL_API int a = ;
  12.  
  13. int CMyDll::a = ; //全局变量
  14.  
  15. // This is an example of an exported function.
  16. MYDLL_API int fnMyDll(void)
  17. {
  18. return ;
  19. }
  20. MYDLL_API void SayHell() //全局函数
  21. {
  22. cout<<"Hello World!"<<endl;
  23. }
  24.  
  25. //静态函数
  26. void CMyDll::SayStatic()
  27. {
  28. cout<<"我是类中的静态函数"<<endl;
  29. cout<<"类中静态变量初始化值是:a="<<CMyDll::a<<endl;
  30. }
  31.  
  32. // This is the constructor of a class that has been exported.这是已导出类的构造函数
  33. // see MyDll.h for the class definition有关该类的定义参阅MyDll.h
  34. CMyDll::CMyDll():name(NULL)
  35. {
  36. return;
  37. }
  38.  
  39. CMyDll::~CMyDll()
  40. {
  41. if(name != NULL)
  42. {
  43. delete[]name;
  44. }
  45. }
  46.  
  47. CMyDll::CMyDll(int _age, char *_name):age(), name(NULL)
  48. {
  49. this->age = _age;
  50. if(_name != NULL)
  51. {
  52. int len = strlen(_name)+;
  53. if(name==NULL)
  54. {
  55. name = new char[len];
  56. }
  57. strcpy_s(name, len, _name);
  58. }
  59. }
  60.  
  61. void CMyDll::Introduce()
  62. {
  63. cout<<"My name is yujianhui"<<endl;
  64. cout<<"Name:"<<name<<endl;
  65. cout<<"Age:"<<age<<endl;
  66. }

项目生成如下:

测试:(这里属于静态加载,即lib和dll都存在的情况下)

步骤:1.在程序中添加头文件;2.加载lib;3.使用。

示例:

  1. #include<iostream>
  2. #include "MyDll.h"
  3. #pragma comment(lib, "MyDll")
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8. cout<<a<<endl;
  9. cout<<f<<endl;
  10. SayHell();
  11. CMyDll mydll(, "yujianhui");
  12. mydll.Introduce();
  13. CMyDll::SayStatic();
  14. system("pause");
  15. }

程序下载:http://pan.baidu.com/s/1mhEqfxQ

程序介绍:VS2010版 使用方法:解压后,使用VS打开.sln文件,然后单击Debug->Start Without Debugging就可以看到运行结果了。因为我为了让压缩包变小所以删除了过程文件,会提示你重新编译,单击确定即可。

C++创建自己的库文件(dll文件创建和编译)的更多相关文章

  1. .h头文件 .lib库文件 .dll动态库文件之间的关系

    .h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的. 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够 ...

  2. VS20xx IDE开发应用时_拷贝VS环境的库文件DLL到目标设备上运行的操作步骤

    问题场景: 当用VSIDE开发完一个项目,在部署到目标环境中时,配置文件OK,但是报错需要调试 <1>Deploying Visual C++ library DLLs as shared ...

  3. 由动态库文件dll生成lib库文件(手动生成.def文件,然后使用lib命令编译,非常牛),同理可使用dll生成.a库文件

    本文基于OpenBlas的编译和安装,来说明如何从一个dll文件生成lib库文件. 参考OpenBlas的说明“Howto generate import library for MingW”,和Mi ...

  4. 由动态库文件dll生成lib库文件

    本文基于OpenBlas的编译和安装.来说明怎样从一个dll文件生成lib库文件. 參考OpenBlas的说明"Howto generate import library for MingW ...

  5. .h头文件 .lib库文件 .dll动态链接库文件关系

    .h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的. 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够 ...

  6. sharepoint rest api 创建文档库 文件夹

    function createFolder() { var requestHeaders = { "Accept": "application/json;odata=ve ...

  7. 【转】VS2013动态库文件的创建及其使用详解

    一.VS2013动态库文件的创建 1.新建项目,win32,win32项目,输入项目名称,例如MakeDll. 2.”确定“——”下一步“,选择”DLL“选项,再点”完成“: 3.菜单栏选择”项目“— ...

  8. .h(头文件) .lib(库文件) .dll(动态链接库文件) 之间的关系和作用的区分

    .h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的.附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够了 ...

  9. linux 下C语言编程库文件处理与Makefile编写

    做开发快3年了,在linux下编译安装软件算是家常便饭了.就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题.看来还是像vs.codeblocks这样的ide把人弄蠢了.便下定决心一 ...

随机推荐

  1. QT:QByteArray和QByteArray、char *(转)

    //常用参数类型:char *字符串, QByteArray字符数组, QString字符串//需要转换:char * ---转--- QByteArray ---需要调用QByteArray类的构造 ...

  2. 《快学Scala》

    Robert Peng's Blog - https://mr-dai.github.io/ <快学Scala>Intro与第1章 - https://mr-dai.github.io/S ...

  3. 桶排序与快速排序算法结合-python实现

    #-*- coding: UTF-8 -*- import numpy as np from QuickSort import QuickSort def BucketSort(a, n): barr ...

  4. [转]基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作

    基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作  转载请注明作者及来源:张峻崎,博客园 目前在.net的范围内,好的而且方便的ORM的真的不是很多,与VS集成 ...

  5. linux中强大的screen命令

    今天发现了一个“宝贝”,就是Linux的screen命令,对于远程登录来说,不仅提供了类似于nohup的功能,而且提供了我非常喜欢的“多个桌面”的功能. 平常开一个putty远程登录,经常需要在两个程 ...

  6. Raspberry Pi 安装FTP(Pure-FTP)

    Raspbian版本: 安装: 因为使用的是默认的pi用户,所以下面的命令都带着sudo. 安装Pure-FTP sudo apt-get install pure-ftpd 2. 创建用户组ftpg ...

  7. hadoop学习day1环境配置笔记(非完整流程)

    hdfs的工作机制: 1.客户把一个文件存入hdfs,其实hdfs会把这个文件切块后,分散存储在N台linux机器系统中(负责存储文件块的角色:data node)<准确来说:切块的行为是由客户 ...

  8. 熟悉下apple 马甲包

    一.什么是马甲包 马甲包是利用App store 规则漏洞,通过技术手段,多次上架同一款产品的方法.马甲包和主产品包拥有同样的内容和功能,除了icon和应用名称不能完全一致,其他基本一致. 二.为什么 ...

  9. javascript instanceof,typeof的区别

    区分string 与 String的区别 为什么结果会是false呢? <script type="text/javascript"> var aColors = [& ...

  10. XE: Changing the default http port

    Oracle XE uses the embedded http listener that comes with the XML DB (XDB) to serve http requests. T ...