首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | 镜像站
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
Linux资讯 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>编程开发>cc++>正文

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

http://www.oklinux.cn  2003-05-01  来源: 互联网  本站整理   会员收藏  游客收藏  【 】 
动态库链接到应用程序中主要有两种方式:隐式链接和显式链接。隐式链接是常用方式。
 如果应用程序和动态库是分别在不同开发平台上编制的,动态库的导入库(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下通过。



上一篇:C++中union的应用剖析   下一篇:C++Builder中的复活节彩蛋


收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·C++Builder中的复活节彩蛋
·C++中union的应用剖析
·CB vs Delphi
·C++Builder制作闹钟
·CB生成的程序需要哪些文件
·C++Builder与Matlab混合编程的实现
·Code Style(代码的风格)
·C++Builder的多线程编程中一些体会
·C++Builder代码片断
·C++Builder 编程指南2
·C++Builder 编程指南1
·C++Builder IDE使用技巧
·C++ Builder开发经验几则
·C++ Builder编写文本编辑器
·C++ Builder:全新的RAD工具
·C++ Builder 下编译含有 MFC 的程式
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·用Eclipse平台进行C/C 开发
·在 Linux 中使用共享对象
·VS:针对Java开发人员的C#编程语言
·使用智能设备扩展在C#中开发自定义控件
·Visual C# 常见问题
·二级C语言实例解答
·一种被忽视的构造和整数溢出重现
·轻轻松松C to C
·与用于 C 的ISO标准保持一致
·用C 的托管扩展针对Windows编程
·运行时和编译时的安全性检查
·轻轻松松C to C (二)
  阅读排行
·c/c++ 学习-read 函数和 write 函数
·程序员眼中的qmail(qmail源代码分析)
·Awk 基础入门:Awk 实例编程
·autoconf 和automake生成Makefile文件
·Linux下的多进程编程
·入门文章:教你学会编写Linux设备驱动
·使用 GDB 调试多进程程序
·C++自动化(模板元)编程基础与应用
·Qt 不规则窗体的实现
·嵌入式程序员应知道的几个基本问题
·Linux操作系统中GCC的应用介绍
·C语言中的指针和内存泄漏
·用GNU profiler提高代码运行速度
·vi 中的正则表达式 (Regular Expressio
·Linux 套接字编程中的 5 个隐患
网摘收藏: