使用链接库

C++里常使用链接库有两种方式:一种为静态的,使用lib库;另外一种是使用动态链接库,分为两种情况:1>将.h文件和lib文件加载到程序中,把dll文件和程序放在同一目录;2>程序中调用LoadLibrary和FreeLibrary动态加载和释放dll文件。

   下面看两个对应的小例子:

    1.使用静态链接库

     首先建立一个空工程,修改工程生成的是lib库。代码:

  1. //----DllMain.h----
  2. //提供函数接口
  3. #pragma once 
  4. extern "C" int __stdcall add(int a,int b);  //使用extern "C"修饰导出接口为C函数
  5. //----DllMain.cpp----
  6. #include "DllMain.h"
  7. int __stdcall add(int a,int b)
  8. {
  9.     return (a + b);
  10. }   

    这样编译就能生成lib文件了。使用Depends查看函数接口:有一个函数名为_add@8

    然后可以创建一个项目使用此lib库,首先应该在工程属性里把lib文件设定为编译依赖库:

  1. #include <iostream>
  2. #include "../StaticDllTest/DllMain.h"  //将必要的函数接口说明头文件包含进来 
  3. using namespace std;
  4. int main()
  5. {
  6.     cout << "Static lib is working ...add(1,2) = " ;
  7.     cout << add(1,2) << endl; //调用lib库里的add函数
  8.     return 0;
  9. }

     到此静态链接库就可以使用了,需要:lib文件和.h函数接口说明文件

 

     2.使用动态链接库

        创建一个空工程,设定工程属性生成dll文件。代码:

  1. //DllMain.h
  2. //头文件用于说明函数接口
  3. #pragma once
  4. //#include <Windows.h>
  5. extern "C" __declspec(dllexport) int __stdcall add(int a, int b);
  6. //注意生成dll导出函数接口需要dllexport关键字
  7. //DllMain.cpp
  8. #include "DllMain.h"
  9. int __stdcall add(int a, int b)
  10. {
  11.     return (a + b);
  12. }

          这样编译成功后就生成了一个dll和一个lib文件。

          1>使用lib .h dll 运行时动态,把头文件和lib文件包含进来;

 

  1. #include <iostream>
  2. #include "../DynamicDll/DllMain.h"
  3. #pragma comment(lib,"../bin/DynamicDll.lib") //加入lib库
  4. using namespace std;
  5. int main()
  6. {
  7.     cout << add(1,2) << endl;
  8.     return 0;
  9. }

          程序执行需要dll文件,所以要把dll文件和执行程序放在同一目录下。

          2>只使用dll文件:

  1. #include <iostream>
  2. #include <windows.h>
  3. using namespace std;
  4. typedef int (__stdcall *PFUN)(int,int);
  5. int main()
  6. {
  7.     PFUN pAdd = NULL;
  8.     HMODULE hDll = LoadLibrary("DynamicDll.dll");
  9.     if (hDll)
  10.         pAdd = (PFUN)GetProcAddress(hDll,_add@8);
  11.     cout << pAdd(3,10) << endl;
  12.     if (hDll)
  13.         FreeLibrary(hDll);
  14.     return 0;
  15. }

         需要说明的是加载dll函数LoadLibrary须知道dll文件名才能调用,然后GetProcAddress也是根据导出dll文件里的函数名来取得函数的地址的。还有函数名_add@8是未经过导出模块定义时生成的dll文件里函数名就是这样了,如果使用DEF文件定义后导出的C风格函数就会像这样“add”没有那些标记符号。DEF文件内容格式如下:

  1. LIBRARY "DynamicDll"
  2. EXPORTS
  3. add   @1

        好了,到此常规的链接库学习就完成了,另外还有两类链接库和MFC有关,暂时不多研究。

你可能感兴趣的:(c,null,mfc,dll,library)