静态链接(按照需要从.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
一起编译
上面编译出来的是dll、lib、exp文件,下面使用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;
}
综上所述,静态链接用h和lib文件,动态链接最好用h和dll文件。但是动态链接比较麻烦。
如何创建.lib文件:1. dll生成的时候会附带(在def文件声明导出) 2.从源文件中生成