【 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;
  }