谈跨平台C++动态连接库的实现

2016-02-19 18:35 8 1 收藏

get新技能是需要付出行动的,即使看得再多也还是要动手试一试。今天图老师小编跟大家分享的是谈跨平台C++动态连接库的实现,一起来学习了解下吧!

【 tulaoshi.com - 编程语言 】


  我对与solaris ,hp ,windows这三个平台的动态库的实现,进行了探索,对于soloaris,hp等Unix平台来讲,主要是make文件的制作,而Windows下还需要对类头进行修饰.
  
  本列主要实现了一个动态库和一个调用动态库的运行程序,动态库包括mytime.h ,mytime.cpp , 在windows下还需要dllt1.cpp ,这个包含动态库的DllMain入口函数,
  
  StdAfx.cpp ,stdAfx.h是与预编译相关的文件. 运行程序包括dy.cpp 包括对动态库的调用。
  
  下面先谈Unix下的编译指令.
  
  一. hp平台下
  
  在hp下使用hp自带的aCC编译器
  
  rm *.o
  rm *.sl
  aCC +z mytime.cpp //+z生成动态库需要的*.o文件
  
  aCC -b -o libmy.sl mytime.o //-b生成动态库 ,-o libmy.sl 表示生成动态库的名称为libmy.sl
  aCC dy.cpp libmy.sl //用dy.cpp libmy.sl生成可执行程序,默认为a.out,也可以用 –o指定名称
  二. solaris平台下
  
  在soloaris下用workshop带的 CC .
  
  CC -c mytime.cpp //-c 生成动态库需要的*.o文件
  CC -G -o libmy.so mytime.o ////-b生成动态库,名称为libmy.so
  CC -Bdynamic -o myee libmy.so dy.cpp //生成可执行程序myee
  
  ln -s /eXPort/home/hurh/tdll/libmy.so /lib // solaris下在运行前要用root用户配置动态库libmy.so
  下面再谈谈Windows下的动态库需要考虑的问题,用VC编译。
  
  主要谈动态库头文件mytime.h 的声明
  
  #ifndef MYTIME_H
  #define MYTIME_H
  
  #ifndef WIN32
   #define DLLT_API __declspec(dllexport)
  #else
   #ifdef JESTERDLL
  #define DLLT_API __declspec(dllexport)
   #else
  #define DLLT_API __declspec(dllimport)
  #pragma comment(lib, "dllt1.lib")
   #endif
  #endif
  
  strUCt DATETYPE
  {
   int year;
   int mon;
   int day;
  };
  
  struct TIMETYPE
  {
   char hour;
   char min;
   char sec;
  };
  
  int DLLT_API getdate(DATETYPE *d);
  int DLLT_API gettime(TIMETYPE *t);
  
  class DLLT_API gqlass{
   public:
  int ineid;
  void setneid(int neid);
  gqlass();
  ~gqlass();
  };
  
  #endif
  宏WIN32, JESTERDLL 需要在动态库编译中用指令 –D 指定。 对于动态库需要导出的类或函数需要用修饰__declspec(dllexport),而对于引用程序需要用__declspec(dllimport) 修饰,这就是我们联合WIN32, JESTERDLL所达到的目的, 动态库的名称为dllt1.dll 假如有了 #pragma comment(lib, "dllt1.lib") 就不需要在make文件指定需要连接dllt1库了.
  
  附部分源代码:
  
  //mytime.cpp
  #include"stdafx.h"
  #include "time.h"
  #include "mytime.h"
  
  int getdate(DATETYPE *d)
  {
   long ti;
   struct tm *tm;
   time(&ti);
   tm=localtime(&ti);
   d-year=tm-tm_year+1900;
   d-mon=tm-tm_mon+1;
   d-day=tm-tm_mday;
   return 0;
  }
  
  int gettime(TIMETYPE *t)
  {
   long ti;
   struct tm *tm;
   time(&ti);
   tm=localtime(&ti);
   t-hour=tm-tm_hour;
   t-min=tm-tm_min;
   t-sec=tm-tm_sec;
   return 0;
  }
  gqlass::gqlass()
  {
   ineid=0;
  }
  gqlass::~gqlass()
  {
  
  }
  
  void gqlass::setneid(int neid)
  {
   ineid=neid;
  
  }
  
  //dy.cpp
  
  #include"stdafx.h"
  #include "stdio.h"
  #include "../dllt1/mytime.h"
  int main()
  {
   DATETYPE d;
   TIMETYPE t;
   void *dp;
   char *error;
  
   puts("动态链接库应用示范");
  
   getdate(&d); /* 调用此共享函数 */
   printf("当前日期: %04d-%02d-%02d",d.year,d.mon,d.day);
  
   gettime(&t); /* 调用此共享函数 */
   printf("当前时间: %02d:%02d:%02d",t.hour,t.min,t.sec);
   gqlass gq;
   printf("before setneid gq.ineid=%d",gq.ineid);
   gq.setneid(123);
   printf("after setneid gq.ineid=%d",gq.ineid);
  
   return 0;
  }

来源:http://www.tulaoshi.com/n/20160219/1618212.html

延伸阅读
数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈。我们可以在互联网上找到很多关于数据库连接池的源程序,但是都发现这样一个共同的问题:这些连接池的实现方法都不同程度地增加了与使用者之间的耦合度。很多的连接池都要求用户通过其规定的方法获取数据库...
前言 面向对象程序设计的基本观点是用程式来仿真大千世界,这使得它的各种根本特性非常人性化,如封装、继续、多态等等,而虚拟函数就是C++中实现多态性的主将。为了实现多态性,C++编译器也革命性地提供了动态联编(或叫晚捆绑)这一特征。 !-- frame contents -- !-- /frame contents -- 虚拟函数亦...
当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道.这些往往会使人受尽折磨.所以如果你想深入C/C++编程,你必须静下心来,好好苦一番. 现在我们将讨论C/C++里我认为哪一本书都没有完全说清楚,也是涉及概念细节最多,语言中最难的技术之一的动态内存的传递.并且在软件开发中很多专业人员并不能写出相关的合格的代码. ...
前一阵子写了一篇文章,提到语言进化的职责之一,就是去除语言中的tricks(职责之二是去除非本质复杂性)。 常看我blog的朋友肯定记得我曾写过的boost源码剖析系列。本来这个系列是打算成书的,但随着对C++的熟悉发生了一些转变,对语言级技术的热衷逐渐消退,再回过头来看boost库中的一些组件,发现原本觉得很有写的必要的东西顿时消...
C语言提供了格式化输入输出的方法,C++也同样,但是C++的控制符使用起来更为简单方便,在c++下有两中方法控制格式化输入输出。 1.有流对象的成员函数。 例如,下列程序以成员函数的方式控制输出的精度://程序作者:管宁  //站点:www.cndev-lab.com  //所有稿件均有版权,如要转载,请务必闻名出处和作者  ...

经验教程

483

收藏

14
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部