一.静态库
用通俗的话讲,静态库就是将代码编译到一个二进制文件下(通常扩展名为.LIB).然后客户
端调用程序,只需要包含相关的.h文件及LIB库文件一起链接到exe文件中.可执行程序发布后,不
再需要该.lib文件了.
二.动态库
最终将编译出.lib与.dll文件. 注意.lib文件与上面的静态库虽然扩展名相同,但有本质的
区别.动态库中的lib文件是动态库的引入库. 该引入库包含被DLL导出的函数和变量的"符号
名".而静态库中的.lib包含了函数和数据,动态库的函数和数据是编译到.dll中.动态链接库调
用方式分为隐式调用与显示调用(也称静态调用与动态调用)。
三.静态库的使用
1.下面来看看如何生成一个静态库
(1)新建静态库工程,新建DllStaticLib.h及新建DllStaticLib.cpp文件
(2)DllStaticLib.h代码如下:
(4)最终生成DllStaticLib.lib静态库文件
2.调用静态库
(1)现在只要使用DllStaticLib.lib,DllStaticLib.h文件.
(注意让VC能搜索到该文件,设置VC相关的包含目录与库目录.
(2)调用代码如下:
四. 动态链接库的使用
1.生成动态链接库
(1)新建动态链接库工程,加入TestDll.h及TestDll.cpp文件
(2)TestDll.h代码如下:
(3)TestDll.cpp代码如下:
(3)注意,将工程中设置属性定义TESTDLL_EXPORTS宏,以便确定该工程为DLL导出
(4)最终生成TestDll.lib及TestDll.dll文件
2.隐式调用Dll库
(1)新建win32控制台工程,加入DllClient.cpp
(2)示例代码如下:
用通俗的话讲,静态库就是将代码编译到一个二进制文件下(通常扩展名为.LIB).然后客户
端调用程序,只需要包含相关的.h文件及LIB库文件一起链接到exe文件中.可执行程序发布后,不
再需要该.lib文件了.
二.动态库
最终将编译出.lib与.dll文件. 注意.lib文件与上面的静态库虽然扩展名相同,但有本质的
区别.动态库中的lib文件是动态库的引入库. 该引入库包含被DLL导出的函数和变量的"符号
名".而静态库中的.lib包含了函数和数据,动态库的函数和数据是编译到.dll中.动态链接库调
用方式分为隐式调用与显示调用(也称静态调用与动态调用)。
三.静态库的使用
1.下面来看看如何生成一个静态库
(1)新建静态库工程,新建DllStaticLib.h及新建DllStaticLib.cpp文件
(2)DllStaticLib.h代码如下:
#ifndef _DLL_STATIC_LIB_H__
#define _DLL_STATIC_LIB_H__
extern " C " {
int add(int x,int y);
}
#endif /*_DLL_STATIC_LIB_H__*/
(3)DllStaticLib.cpp代码如下:
#define _DLL_STATIC_LIB_H__
extern " C " {
int add(int x,int y);
}
#endif /*_DLL_STATIC_LIB_H__*/
#include
"
DllStaticLib.h
"
#include " stdafx.h "
int add( int x, int y)
{
return x+y;
}
#include " stdafx.h "
int add( int x, int y)
{
return x+y;
}
(4)最终生成DllStaticLib.lib静态库文件
2.调用静态库
(1)现在只要使用DllStaticLib.lib,DllStaticLib.h文件.
(注意让VC能搜索到该文件,设置VC相关的包含目录与库目录.
(2)调用代码如下:
#include
"
stdafx.h
"
#include < conio.h >
#include " DllStaticLib.h " // 要设置VC包含目录,以便编译时能找到头文件
// 要设置VC库目录,以便编译链接时可以找到该DllStaticLib.lib
#pragma comment(lib, " DllStaticLib.lib " )
int main( int argc, char * argv[])
{
printf("%d\n",add(3,5));
_getch();
return 0;
}
#include < conio.h >
#include " DllStaticLib.h " // 要设置VC包含目录,以便编译时能找到头文件
// 要设置VC库目录,以便编译链接时可以找到该DllStaticLib.lib
#pragma comment(lib, " DllStaticLib.lib " )
int main( int argc, char * argv[])
{
printf("%d\n",add(3,5));
_getch();
return 0;
}
四. 动态链接库的使用
1.生成动态链接库
(1)新建动态链接库工程,加入TestDll.h及TestDll.cpp文件
(2)TestDll.h代码如下:
#ifndef _TEST_DLL_H__
#define _TEST_DLL_H__
#ifdef TESTDLL_EXPORTS
#define TESTDLL_API __declspec(dllexport)
#else
#define TESTDLL_API __declspec(dllimport)
#endif
extern " C " TESTDLL_API int sum( int x, int y);
#endif /*_TEST_DLL_H__*/
#define _TEST_DLL_H__
#ifdef TESTDLL_EXPORTS
#define TESTDLL_API __declspec(dllexport)
#else
#define TESTDLL_API __declspec(dllimport)
#endif
extern " C " TESTDLL_API int sum( int x, int y);
#endif /*_TEST_DLL_H__*/
(3)TestDll.cpp代码如下:
#include
"
TestDll.h
"
int sum( int x, int y)
{
return x+y;
}
int sum( int x, int y)
{
return x+y;
}
(3)注意,将工程中设置属性定义TESTDLL_EXPORTS宏,以便确定该工程为DLL导出
(4)最终生成TestDll.lib及TestDll.dll文件
2.隐式调用Dll库
(1)新建win32控制台工程,加入DllClient.cpp
(2)示例代码如下:
#include
<
iostream
>
#include < conio.h >
#include " TestDll.h " // 要设置VC包含目录,以便编译时能找到头文件
using namespace std;
// 要设置VC库目录,以便编译链接时可以找到该DllStaticLib.lib
#pragma comment(lib, " TestDll.lib " )
int main( int argc, char * argv[])
{
printf("%d\n",sum(8,9));
_getch();
return 0;
}
#include < conio.h >
#include " TestDll.h " // 要设置VC包含目录,以便编译时能找到头文件
using namespace std;
// 要设置VC库目录,以便编译链接时可以找到该DllStaticLib.lib
#pragma comment(lib, " TestDll.lib " )
int main( int argc, char * argv[])
{
printf("%d\n",sum(8,9));
_getch();
return 0;
}
(3)说明,隐式调用需要lib文件,但是exe编译后,就不再需要lib,只需要dll文件即可.
以下显式调用不需要lib文件,只需要提供dll文件.随exe运行与结束装载或释放dll文件.
3.显式调用Dll库
(1)同上新建win32工程.加入cpp文件,代码如下:
#include
<
iostream
>
#include < conio.h >
#include < windows.h >
using namespace std;
typedef int FUN_SUM( int x, int y);
int main( int argc, char * argv[])
{
HINSTANCE hDll; //DLL句柄
hDll = LoadLibrary(L"TestDll.dll");
if (hDll != NULL)
{
FUN_SUM *sum = (FUN_SUM*)GetProcAddress(hDll, "sum");
if(sum)
{
cout<<(*sum)(9,10)<<endl;
}
else
{
cout<<"获取sum函数指针失败!"<<endl;
}
FreeLibrary(hDll);
}
else
{
cout<<"装载TestDll.dll失败!"<<endl;
}
_getch();
return 0;
}
转载http://www.cppblog.com/API/archive/2011/03/10/141506.html
#include < conio.h >
#include < windows.h >
using namespace std;
typedef int FUN_SUM( int x, int y);
int main( int argc, char * argv[])
{
HINSTANCE hDll; //DLL句柄
hDll = LoadLibrary(L"TestDll.dll");
if (hDll != NULL)
{
FUN_SUM *sum = (FUN_SUM*)GetProcAddress(hDll, "sum");
if(sum)
{
cout<<(*sum)(9,10)<<endl;
}
else
{
cout<<"获取sum函数指针失败!"<<endl;
}
FreeLibrary(hDll);
}
else
{
cout<<"装载TestDll.dll失败!"<<endl;
}
_getch();
return 0;
}
转载http://www.cppblog.com/API/archive/2011/03/10/141506.html
(2)显式链接在程序运行中可以把DLL的内存动态映射到调用进程的地址空间。释放可按需释放,使用更灵活.