C++创建自己的库文件(dll文件创建和编译)
创建编译库文件有个好处就是不容易被修改,加密的,方便调用,但是缺点是不容易查看其中的内容,反编译比较麻烦。下面让我们使用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文件创建和编译)的更多相关文章
- .h头文件 .lib库文件 .dll动态库文件之间的关系
		
.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的. 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够 ...
 - VS20xx IDE开发应用时_拷贝VS环境的库文件DLL到目标设备上运行的操作步骤
		
问题场景: 当用VSIDE开发完一个项目,在部署到目标环境中时,配置文件OK,但是报错需要调试 <1>Deploying Visual C++ library DLLs as shared ...
 - 由动态库文件dll生成lib库文件(手动生成.def文件,然后使用lib命令编译,非常牛),同理可使用dll生成.a库文件
		
本文基于OpenBlas的编译和安装,来说明如何从一个dll文件生成lib库文件. 参考OpenBlas的说明“Howto generate import library for MingW”,和Mi ...
 - 由动态库文件dll生成lib库文件
		
本文基于OpenBlas的编译和安装.来说明怎样从一个dll文件生成lib库文件. 參考OpenBlas的说明"Howto generate import library for MingW ...
 - .h头文件 .lib库文件 .dll动态链接库文件关系
		
.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的. 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够 ...
 - sharepoint rest api 创建文档库 文件夹
		
function createFolder() { var requestHeaders = { "Accept": "application/json;odata=ve ...
 - 【转】VS2013动态库文件的创建及其使用详解
		
一.VS2013动态库文件的创建 1.新建项目,win32,win32项目,输入项目名称,例如MakeDll. 2.”确定“——”下一步“,选择”DLL“选项,再点”完成“: 3.菜单栏选择”项目“— ...
 - .h(头文件)   .lib(库文件)  .dll(动态链接库文件) 之间的关系和作用的区分
		
.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的.附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够了 ...
 - linux 下C语言编程库文件处理与Makefile编写
		
做开发快3年了,在linux下编译安装软件算是家常便饭了.就拿gcc来说,都有不下10次了,可基本每次都会碰到些奇奇怪怪的问题.看来还是像vs.codeblocks这样的ide把人弄蠢了.便下定决心一 ...
 
随机推荐
- PAT 甲级 1009 Product of Polynomials (25)(25 分)(坑比较多,a可能很大,a也有可能是负数,回头再看看)
			
1009 Product of Polynomials (25)(25 分) This time, you are supposed to find A*B where A and B are two ...
 - Spring主从数据源动态切换
			
参考文档: http://uule.iteye.com/blog/2126533 http://lanjingling.github.io/2016/02/15/spring-aop-dynamicd ...
 - 手工编写servlet
			
index.jsp: <%@ page language="java" import="java.util.*" contentType="te ...
 - 模板引擎文档 - layui.laytpl 介绍
			
<!DOCTYPE html> <html class="ui-page-login"> <head> <meta charset=&qu ...
 - selenium+python自动化81-html报告优化(饼图+失败重跑+兼容python2&3)
			
优化html报告 为了满足小伙伴的各种变态需求,为了装逼提升逼格,为了让报告更加高大上,测试报告做了以下优化: 测试报告中文显示,优化一些断言失败正文乱码问题 新增错误和失败截图,展示到html报告里 ...
 - 将python源文件打包成exe文件
			
pyinstaller 库的使用PyInstaller是一个十分有用的第三方库,它能够在Windows.Linux.Mac OS X 等操作系统下将 Python 源文件打包,通过对源文件打包,Pyt ...
 - Vim中nerdtree配置
			
nerdtree nerdtree,就是一个文件树目录. 配置脚本 "文件树 Plug 'scrooloose/nerdtree' Plug 'Xuyuanp/nerdtree-git-pl ...
 - Windows环境下为PHP5.6安装redis扩展和memcached扩展
			
一.php安装redis扩展 1.使用phpinfo()函数查看PHP的版本信息,这会决定扩展文件版本 2.根据PHP版本号,编译器版本号和CPU架构, 选择php_redis-2.2 ...
 - MS SQL 流程控制语句
			
Declare myCursor cursor For Select * from table1 open myCursor Fet ...
 - 对象的notify方法的含义和对象锁释放的三种情况
			
1,notify的含义 (1)notify一次只随机通知一个线程进行唤醒 (2)在执行了notify方法之后,当前线程不会马上释放该对象锁,呈wait状态的线程也不能马上获得该对象锁, 要等到 ...