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把人弄蠢了.便下定决心一 ...
随机推荐
- QT:QByteArray和QByteArray、char *(转)
//常用参数类型:char *字符串, QByteArray字符数组, QString字符串//需要转换:char * ---转--- QByteArray ---需要调用QByteArray类的构造 ...
- 《快学Scala》
Robert Peng's Blog - https://mr-dai.github.io/ <快学Scala>Intro与第1章 - https://mr-dai.github.io/S ...
- 桶排序与快速排序算法结合-python实现
#-*- coding: UTF-8 -*- import numpy as np from QuickSort import QuickSort def BucketSort(a, n): barr ...
- [转]基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作
基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作 转载请注明作者及来源:张峻崎,博客园 目前在.net的范围内,好的而且方便的ORM的真的不是很多,与VS集成 ...
- linux中强大的screen命令
今天发现了一个“宝贝”,就是Linux的screen命令,对于远程登录来说,不仅提供了类似于nohup的功能,而且提供了我非常喜欢的“多个桌面”的功能. 平常开一个putty远程登录,经常需要在两个程 ...
- Raspberry Pi 安装FTP(Pure-FTP)
Raspbian版本: 安装: 因为使用的是默认的pi用户,所以下面的命令都带着sudo. 安装Pure-FTP sudo apt-get install pure-ftpd 2. 创建用户组ftpg ...
- hadoop学习day1环境配置笔记(非完整流程)
hdfs的工作机制: 1.客户把一个文件存入hdfs,其实hdfs会把这个文件切块后,分散存储在N台linux机器系统中(负责存储文件块的角色:data node)<准确来说:切块的行为是由客户 ...
- 熟悉下apple 马甲包
一.什么是马甲包 马甲包是利用App store 规则漏洞,通过技术手段,多次上架同一款产品的方法.马甲包和主产品包拥有同样的内容和功能,除了icon和应用名称不能完全一致,其他基本一致. 二.为什么 ...
- javascript instanceof,typeof的区别
区分string 与 String的区别 为什么结果会是false呢? <script type="text/javascript"> var aColors = [& ...
- 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 ...