如何创建和使用动态链接(dll)和静态链接(lib),全面总结

静态链接(按照需要从.lib文件读取并写进exe文件,生成的exe文件可以独立运行):

//文件:lib.h

#ifndef LIB_H

#define LIB_H

extern "C" int add(int x,int y);//声明为C编译、连接方式的外部函数

#endif

//文件:lib.cpp

#include "lib.h"

int add(int x,int y)

{

return x + y;

}

上面的编译后生成.lib文件

#include <stdio.h>

#include "..\lib.h"//需要使用.h文件

#pragma comment( lib, "..\\debug\\libTest.lib" ) //指定与静态库一起连接,或者用命令行编译时候可以使用cl.exe  XXX.cpp XXX.c XXX.lib的方法

int main(int argc, char* argv[])

{

printf( "2 + 3 = %d", add( 2, 3 ) );

}





动态链接:

先建立一个dll工程


/* 文件名:lib.h*/

#ifndef LIB_H

#define LIB_H

extern "C" int __declspec(dllexport)add(int x, int y);//好像不行,有点奇怪,应该写为 extern int add(int x, int y);

#endif

/* 文件名:lib.cpp*/

#include "lib.h"

int add(int x, int y)

{

return x + y;

} 

再写一个def文件

LIBRARY lib

EXPORTS

add @ 1

一起编译

上面编译出来的是dlllibexp文件,下面使用dll文件就够了


注意,不能在dll工程里面编译exe文件,最终编译出来的是dll

#include <stdio.h>

#include <windows.h>

typedef int(*lpAddFun)(int, int); //宏定义函数指针类型

//上面或者这样写:extern "C" __declspec(dllimport) add(int x,int y);

//但如果有h文件,不用再声明函数,前面的声明都不需要了

int main(int argc, char *argv[])

{

HINSTANCE hDll; //DLL句柄 

lpAddFun addFun; //函数指针

hDll = LoadLibrary("..\\Debug\\dllTest.dll");

if (hDll != NULL)

{

addFun = (lpAddFun)GetProcAddress(hDll, "add");  //如果有lib文件就可以不用这样,可直接使用dll里面的函数

if (addFun != NULL)

{

int result = addFun(2, 3);

printf("%d", result);

}

FreeLibrary(hDll);

}

return 0;

}



如何创建dll文件:

除了上面的方法,当然可以不用.h文件来弄:

//dlltest2.c文件

#include <windows.h>

char szReturn[MAX_PATH];

__declspec(dllexport) LPCTSTR RetrieveTempFilename(LPCTSTR szDirectory, LPCTSTR szPrefix)

{

     char szBuffer[MAX_PATH];

     if(GetTempFileName(szDirectory,szPrefix,0,szBuffer) == 0)

     {

          // It failed - return the string "ERROR"

          lstrcpy(szReturn,"ERROR");

     } else {

          // Success!

          lstrcpy(szReturn,szBuffer);

     }

     return szReturn;

}

再写一个.def文件 一起编译:

LIBRARY dlltest2

EXPORTS

     RetrieveTempFilename

这样就生成dll文件了(附带生成lib文件)




我的使用dll方法:

方法一:不用.h文件,上面我也没写,只写了一个.c,生成了一个.lib

#include <windows.h>

#include <stdio.h>

#pragma comment (lib,"dlltest2.lib")

LPCTSTR RetrieveTempFilename(LPCTSTR szDirectory, LPCTSTR szPrefix); //这里没有.h文件只好自己声明

int main(int argc, char *argv[])

{

char *s;

HINSTANCE hDll; //DLL句柄 

hDll = LoadLibrary("dlltest2.dll");

if (hDll != NULL)

{

s=RetrieveTempFilename("%TempLaunchFolder%\\MakeTempFilenameDLL.dll","RetrieveTempFilename");

printf("%s",s);

FreeLibrary(hDll);

}

else printf("can't load");

return 0;

}

第二种:不用lib文件,直接使用dll   (条件是事先已经知道dll里面函数的声明当然你有.h文件更好,不用再写函数声明了(即typedef LPCTSTR (*lpRetrieveTempFilename)(LPCTSTR szDirectory, LPCTSTR szPrefix); 这行))

#include <windows.h>

#include <stdio.h>

typedef LPCTSTR (*lpRetrieveTempFilename)(LPCTSTR szDirectory, LPCTSTR szPrefix); 

int main(int argc, char *argv[])

{

char *s;

HINSTANCE hDll; //DLL句柄 

lpRetrieveTempFilename pfilename; //函数指针

hDll = LoadLibrary("dlltest2.dll");

if (hDll != NULL)

{

pfilename= (lpRetrieveTempFilename)GetProcAddress(hDll, "RetrieveTempFilename");  //不用.lib文件只好用这个GetProcAddress

if (pfilename != NULL)

{

s=pfilename("%TempLaunchFolder%\\MakeTempFilenameDLL.dll","RetrieveTempFilename");

printf("%s",s);

}

FreeLibrary(hDll);

}

else printf("can't load");

return 0;

}

综上所述,静态链接用hlib文件,动态链接最好用h和dll文件。但是动态链接比较麻烦。

如何创建.lib文件:1. dll生成的时候会附带(在def文件声明导出)   2.从源文件中生成


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值