程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 談跨平台C++動態連接庫的實現

談跨平台C++動態連接庫的實現

編輯:C++入門知識

  我對與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("當前
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved