创建编译库文件有个好处就是不容易被修改,加密的,方便调用,但是缺点是不容易查看其中的内容,反编译比较麻烦。下面让我们使用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头文件声明

#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport) //定义MYDLL_API为导出类型
#else
#define MYDLL_API __declspec(dllimport)
#endif // This class is exported from the MyDll.dll 该类从MyDll.dll中导出
class MYDLL_API CMyDll {
public:
CMyDll(void);
CMyDll(int _age, char *_name); //年龄和姓名 构造函数
~CMyDll();
// TODO: add your methods here.
void Introduce(); //介绍函数
static void SayStatic();
private:
int age;
char* name;
static int a;
};

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

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

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

#include "stdafx.h"
#include "MyDll.h"
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std; // This is an example of an exported variable
MYDLL_API int nMyDll=;
MYDLL_API float f = 3.14;
MYDLL_API int a = ; int CMyDll::a = ; //全局变量 // This is an example of an exported function.
MYDLL_API int fnMyDll(void)
{
return ;
}
MYDLL_API void SayHell() //全局函数
{
cout<<"Hello World!"<<endl;
} //静态函数
void CMyDll::SayStatic()
{
cout<<"我是类中的静态函数"<<endl;
cout<<"类中静态变量初始化值是:a="<<CMyDll::a<<endl;
} // This is the constructor of a class that has been exported.这是已导出类的构造函数
// see MyDll.h for the class definition有关该类的定义参阅MyDll.h
CMyDll::CMyDll():name(NULL)
{
return;
} CMyDll::~CMyDll()
{
if(name != NULL)
{
delete[]name;
}
} CMyDll::CMyDll(int _age, char *_name):age(), name(NULL)
{
this->age = _age;
if(_name != NULL)
{
int len = strlen(_name)+;
if(name==NULL)
{
name = new char[len];
}
strcpy_s(name, len, _name);
}
} void CMyDll::Introduce()
{
cout<<"My name is yujianhui"<<endl;
cout<<"Name:"<<name<<endl;
cout<<"Age:"<<age<<endl;
}

项目生成如下:

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

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

示例:

#include<iostream>
#include "MyDll.h"
#pragma comment(lib, "MyDll")
using namespace std; int main()
{
cout<<a<<endl;
cout<<f<<endl;
SayHell();
CMyDll mydll(, "yujianhui");
mydll.Introduce();
CMyDll::SayStatic();
system("pause");
}

程序下载: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. Windows自带NAT端口映射,命令行CMD操作即可

    由于有需求进行端口映射,又不想装乱七八糟的软件,Windows本身自带的路由远程访问配置太麻烦,还要两块网卡,坑爹啊. 其实Windows本身命令行支持配置端口映射,条件是已经安装了IPV6,启不启用 ...

  2. PLSQL在64位 win7/WIN8上运行(绿色版plsql、无需安装oracle客户端)

    一.准备需要的文件: 1.plsql文件绿色压缩包 2.oracle客户端文件绿色压缩包 二.设置PLSQL 运行plsql,不登陆进入plsql点“工具”-“首选项” 按照如图设置“ oracle主 ...

  3. Web service 框架比较CXF xfire aisx2 aisx

    Web 服务框架.它还体现了从 Axis 1.x 系列获得的经验和最近两年在 Web 服务领域的发展.推出 Axis2 的主要原因之一是从速度和内存方面获得更好的性能——不过还添加了一些新特性和功能. ...

  4. php soap实例讲解

    一,什么是soap,什么是wsdl,为什么要用他们 SOAP是基于XML和HTTP通信协议,xml各种平台,各种语言都支持的一个种语言.http呢它得到了所有的因特网浏览器及服务器的支持. WSDL ...

  5. java 查询solr时间格式

    solr时间格式是2015-07-06T00:00:00.0Z,所以下面是把当前时间做转换 SimpleDateFormat format = new SimpleDateFormat("y ...

  6. mysql之SQLYog配置

    SQLyog(MySQL图形化开发工具) 安装: 提供的SQLyog软件为免安装版,可直接使用 使用: 输入用户名.密码,点击连接按钮,进行访问MySQL数据库进行操作

  7. Spring MVC 学习 之 - 拦截器

    public class GlobalInterceptor implements HandlerInterceptor { public boolean preHandle(HttpServletR ...

  8. Redis 主从分离

    首先配置redis.conf文件如下6个位置 cp 多个redis.conf文件 开启daemonize yes PID文件名字 端口 log文件名字 dump.rdb名字 配置: 主机不动,配置从机 ...

  9. 迷你MVVM框架 avalonjs 学习教程9、类名操作

    ms-class是avalon用得最多的几个绑定之一,也正因为如此其功能一直在扩充中.根据时期的不同,分为旧风格与新风格两种. 旧风格是指ms-class-xxx=”expr”,*ms-class-a ...

  10. Dubbo Overview

    Overview Architecture Provider: 暴露服务的服务提供方. Consumer: 调用远程服务的服务消费方. Registry: 服务注册与发现的注册中心. Monitor: ...