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

2008-02-23 05:24:30来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

 我对和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("当前日期: d-d-d\n",d.year,d.mon,d.day);

 gettime(&t); /* 调用此共享函数 */
 printf("当前时间: d:d:d\n",t.hour,t.min,t.sec);
 gqlass gq;
 printf("before setneid gq.ineid=%d\n",gq.ineid);
 gq.setneid(123);
 printf("after setneid gq.ineid=%d\n",gq.ineid);

 return 0;
}




标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 单链表的c语言实现(1)

下一篇: C 中建立对象间消息连接的系统方法

热门词条
热门标签