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

凤城大鑫

凤城大鑫

2016-02-19 18:35

get新技能是需要付出行动的,即使看得再多也还是要动手试一试。今天图老师小编跟大家分享的是谈跨平台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("当前时间: %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;
  }
展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
谈跨平台C++动态连接库的实现

用C++实现跨平台游戏开发之Allegro引擎

编程语言 网络编程
用C++实现跨平台游戏开发之Allegro引擎

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

C/C++ 跨平台I/O操作技巧

编程语言 网络编程
C/C++ 跨平台I/O操作技巧

C++跨平台游戏开发之ClanLib SDK

编程语言 网络编程
C++跨平台游戏开发之ClanLib SDK

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

C/C++中动态链接库的创建和调用

编程语言 网络编程
C/C++中动态链接库的创建和调用

C++之父Bjarne谈C++的未来发展

编程语言 网络编程
C++之父Bjarne谈C++的未来发展

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

异步消息的传递之回调机制

异步消息的传递之回调机制

win10怎么设置程序排列顺序

win10怎么设置程序排列顺序
下拉加载更多内容 ↓