C++Builder中动态库的链接问题
谢伟成、王斌
动态库链接到应用程序中主要有两种方式：隐式链接和显式链接。隐式 链接是常用方式。 如果应用程序和动态库是分别在不同开发平台上编制的，动态库的导入 库（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下通过。