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把人弄蠢了.便下定决心一 ...
随机推荐
- 根据tomcat的日志判断web的发布路径以及服务路径
[ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.startup.HostConfig.unde ...
- mysql-1安装和数据库的管理
1.安装 直接docker安装,客户端使用Navicat Premium. docker run -d --name csjmysql -p 3306:3306 -e MYSQL_ROOT_PASSW ...
- Git 安装部署
CentOS6的yum源中已经有git的版本了,可以直接使用yum源进行安装. yum install/remove git 但是yum源中安装的git版本是1.7.1,太老了,Github等需要的G ...
- flask 蓝图
转自:http://spacewander.github.io/explore-flask-zh/7-blueprints.html 蓝图 什么是蓝图? 一个蓝图定义了可用于单个应用的视图,模板,静态 ...
- C++builder XML XSL 代码生成
void __fastcall TFrmGenCode::XSLTxml1Click(TObject *Sender) { // XSLT转换xml文件格式 _di_IXMLDocument xml; ...
- Eclipse使用xdoclet1.2.3 生成hibernate配置文件和映射文件
用ant和xdoclet生成hibernate配置文件可以为我们省去很多配置的操作,废话不多说,直接给栗子: 测试环境: eclipse:Eclipse Java EE IDE for Web Dev ...
- 想取得刚才nextval()的值时,放心大胆的用currval()吧,currval()的返回值并不会因为nextval()的并发访问而混乱
以前写sql的时候总是担心current()得到的值并不会绝对等于我上一次nextval()取得的值;因为可能其他线程并发访问nextval(). 先说结论吧:当你拿到一个数据库连接,先nextval ...
- Luajit-2.1.0-beta1的发布和生成arm64用bytecode的解脱
前情提要:由于苹果要求2015年2月1日上架的新app必须支持64位的arm64,旧的app也得在6月1日支持64位,来源.于是unity3d弄出了il2cpp这种花式的玩法来进行64位支持,而对于当 ...
- Incorrect string value: '\xF0\x9F\x98\x84\xF0\x9F
问题描述:从新浪微博抓取消息保存到MySQL数据中,对应数据库字段为varchar,字符编码utf-8.部分插入成功,部分插入失败,报错如标题. 在网上查询,有人说是编码问题,建议修改编码格式,比如改 ...
- dom4j读取XML文件内容
<?xml version="1.0" encoding="UTF-8"?> <RESULT> <VALUE> <NO ...