创建编译库文件有个好处就是不容易被修改,加密的,方便调用,但是缺点是不容易查看其中的内容,反编译比较麻烦。下面让我们使用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. 根据tomcat的日志判断web的发布路径以及服务路径

    [ContainerBackgroundProcessor[StandardEngine[Catalina]]] org.apache.catalina.startup.HostConfig.unde ...

  2. mysql-1安装和数据库的管理

    1.安装 直接docker安装,客户端使用Navicat Premium. docker run -d --name csjmysql -p 3306:3306 -e MYSQL_ROOT_PASSW ...

  3. Git 安装部署

    CentOS6的yum源中已经有git的版本了,可以直接使用yum源进行安装. yum install/remove git 但是yum源中安装的git版本是1.7.1,太老了,Github等需要的G ...

  4. flask 蓝图

    转自:http://spacewander.github.io/explore-flask-zh/7-blueprints.html 蓝图 什么是蓝图? 一个蓝图定义了可用于单个应用的视图,模板,静态 ...

  5. C++builder XML XSL 代码生成

    void __fastcall TFrmGenCode::XSLTxml1Click(TObject *Sender) { // XSLT转换xml文件格式 _di_IXMLDocument xml; ...

  6. Eclipse使用xdoclet1.2.3 生成hibernate配置文件和映射文件

    用ant和xdoclet生成hibernate配置文件可以为我们省去很多配置的操作,废话不多说,直接给栗子: 测试环境: eclipse:Eclipse Java EE IDE for Web Dev ...

  7. 想取得刚才nextval()的值时,放心大胆的用currval()吧,currval()的返回值并不会因为nextval()的并发访问而混乱

    以前写sql的时候总是担心current()得到的值并不会绝对等于我上一次nextval()取得的值;因为可能其他线程并发访问nextval(). 先说结论吧:当你拿到一个数据库连接,先nextval ...

  8. Luajit-2.1.0-beta1的发布和生成arm64用bytecode的解脱

    前情提要:由于苹果要求2015年2月1日上架的新app必须支持64位的arm64,旧的app也得在6月1日支持64位,来源.于是unity3d弄出了il2cpp这种花式的玩法来进行64位支持,而对于当 ...

  9. Incorrect string value: '\xF0\x9F\x98\x84\xF0\x9F

    问题描述:从新浪微博抓取消息保存到MySQL数据中,对应数据库字段为varchar,字符编码utf-8.部分插入成功,部分插入失败,报错如标题. 在网上查询,有人说是编码问题,建议修改编码格式,比如改 ...

  10. dom4j读取XML文件内容

    <?xml version="1.0" encoding="UTF-8"?> <RESULT> <VALUE> <NO ...