以下全部是以vs2013下为例 进行说明,即 动态库用vs2013生成; 同时用vs2013 调用动态链接库
生成的静态链接库中,只有两个文件有用: *. h 文件 和 .lib文件
.h 文件用来声明, .lib文件包含函数的索引以及实现等 。
在调用该动态链接库的程序中,只需写入两条语句即可 ,例如 #include"jiajianchengchu.h" 和 #pragma comment(lib,"./jiajianchengchu.lib")
通过上述两条语句我们知道:都是 # 号 开头,说明在 预处理阶段就被替换,因此 .h文件 和 .lib文件的位置 真心不重要, 放在什么位置都可以,只需要到时候包含进来即可。这非常重要!!!
一般而言我们把 .h文件 和 .lib文件 和 调用程序的.cpp放在一块,因为这样的话 我们写路径时就可以很方便,比如上述的
#include"jiajianchengchu.h"
#pragma comment(lib,". / jiajianchengchu.lib") 或 #pragma comment(lib,"jiajianchengchu.lib")
就是采用的相对路径写法。
动态静态链接库中,三个文件可能会有用: *. h 文件 和 .lib文件 和 .dll文件
不过 .lib中并没有存储函数实现等,只是存储的链接程序所必须的信息。 dll文件存储的是函数的具体实现。
隐式调用时候
.h 文件 和 .lib 文件的用法跟静态链接库的用法完全相同(上述紫色的话非常重要!!!),都是用那两条语句,都是跟cpp放在一块。不同的是:加载时会去找.dll文件的位置。
关于dll的存放位置有三个地方可以放:
1、跟程序exe放在一块,(即debug文件夹下,注意是解决方案下的那个debug文件夹,不是项目下的那个debug)
2、跟.cpp放在一块 (即 .h .lib .dll .cpp 都放在了一块)
3、放在系统目录下system32文件夹或system64文件夹下
4、环境变量所列出的路径下
一般而言 dll都跟exe放在一块,即 debug文件夹下。
显式调用时候(很简单,不要想的太难,请看书)
只用到.dll文件,只需要把.dll文件放到上述四个文件夹下一个即可(当然还是推荐第一个)。
其他还有不懂的请查阅《VC++深入详解这本书》,
一些代码:例如dllmain函数的作用
// dllmain.cpp : 定义 DLL 应用程序的入口点。
#include "stdafx.h"
BOOL APIENTRY DllMain(HMODULE hModule, //模块调用
DWORD ul_reason_for_call, //调用原因
LPVOID lpReserved //保留参数 不用关心
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH: //被其他程序加载时候
MessageBox(NULL, L"加减乘除DLL被加载", L"l love Mark", MB_OK);
break;
case DLL_THREAD_ATTACH: //当其他程序启动了一个线程的时候
break;
case DLL_THREAD_DETACH: //当其他程序某个线程线程终止运行的时候
break;
case DLL_PROCESS_DETACH: //被其他程序加载的时候
MessageBox(NULL, L"加减乘除DLL被卸载", L"l love Mark", MB_OK);
break;
}
return TRUE;
}
某个动态链接库的头文件: (关于加不加extern c防止命名倾轧等问题查看VC++深入详解即可)
这样定义的目的有好处
#ifdef DLL1_API
#else
#define DLL1_API _declspec(dllimport)
#endif
所有的函数一定要设置成为导出类型,否则无法生成lib文件,不存在导出的函数
DLL1_API double add(double a, double b);
DLL1_API double subtract(double a, double b);
DLL1_API double multiply(double a, double b);
DLL1_API double chu(double a, double b);
class DLL1_API Point
{
public:
void output(int x, int y);
};