当前位置:天才代写 > tutorial > C语言/C++ 教程 > C++Builder中动态库的链接问题

C++Builder中动态库的链接问题

2017-11-06 08:00 星期一 所属: C语言/C++ 教程 浏览:718

动态库链接到应用措施中主要有两种方法:隐式链接和显式链接。隐式链接是常用方法。

假如应用措施和动态库是别离在差异开拓平台上体例的,动态库的导入库(lib文件)大概会与应用措施的开拓平台所要求的导入库名目不相容,从而在应用措施与动态库隐式链接时,呈现措施链接错误:contains invalid OMF record。譬喻在C++Builder开拓平台上链接Visual C++建造的动态库时,就会呈现上述的错误。办理这一问题,可以回收两种要领:显式毗连法和利用C++Builder中提供的导入库生成东西。

显式毗连:显式毗连不需要在工程中插手导入库和相应的头文件,只需要把动态库放入指定的目次下。在应用措施中通过函数挪用显式的装载和卸掉DLL,通过函数指针来挪用DLL的导出函数。

步调:

1. 挪用LoadLibrary函数装载DLL并获得模块句柄;

2. 挪用GetProcAddress函数获取指定导出函数的指针;

3. 用这个函数的指针挪用该函数;

4. 利用完毕后,用FreeLibrary释放DLL。

例子:

用VC++建造一个动态库:

选new→Project→Win32—Dynamic—Link Library,插手addit.cpp

  extern ″C″
   {
   void __declspec( dllexport ) addit(int a, int b, int *c)
   {
    *c = a + b;
   }
   }
   addit.h
   extern ″C″
   {void addit(int a, int b, int *c);}

编译链接生成addit.dll和addit.lib。在C++Builder措施中挪用addit函数。

C++Builder措施中:

  {
   HINSTANCE handle; //DLLa模块的句柄
  FARPROC lpFarProc;
   void (*lpaddit)(int,int,int *);//指向addit函数的指针
   int ntemp;
   handle = LoadLibrary(″addit.dll″); //装载addit.dll, 获得该库句柄 addit.dll位于当前目次下
   lpFarProc = GetProcAddress(handle,″addit″);   //获得指向函数addit的指针
   lpaddit = (void(__cdecl *)(int, int, int *))lpFarProc; //指针范例转换
   lpaddit(2,3,&ntemp); //利用addit函数
   FreeLibrary(handle); //将addit.dll从措施中卸掉
   }

此措施在VC++ 5.0 和C++Builder 3.0下通过。

利用C++Builder中提供的导入库生成东西:先预处理惩罚,后隐式链接。

步调:

1.用C++Builder提供的implib.exe东西从头生成该动态库(xxx.dll)的导入库(xxx.lib)。呼吁如下:

implib addit.lib addit.dll。

addit.dll为已有动态库,addit.lib为要生成的导入库。由今生成的导入库addit.lib名目与C++Builder开拓平台是相容的;

2.在动态库的头文件addit.h中,对其输出函数从头说明,语句如下:

extern __stdcall void addit( int a, int b, int *c);

3.然后回收隐式链接法,将从头生成的导入库(addit.lib)和从头说明的头文件(addit.h)插手到C++Builder应用措施的工程项目中,举办编译和毗连。

addit.dll按上述步调操纵,在VC++ 5.0 和C++Builder 3.0下通过。

 

    关键字:

天才代写-代写联系方式