工具软件   办公软件   操作系统   网络安全   设计在线   程序开发   教程宝典   软件下载   软件论坛
您的位置:软件 > 开发者网络 > 开发工具 > 开发专栏 > C/C++ > 正文
谈跨平台C++动态连接库的实现
[文章信息]
作者:foolpanda1168
时间:2005-02-21
出处:blog
责任编辑:方舟
[文章导读]
我对与solaris ,hp ,windows这三个平台的动态库的实现,进行了探索
advertisement
热点推荐
· 活用flashget数据库
· 邮件蠕虫的四招防范技巧
· 用递归算法解决VC中CEdit的一个Bug
· QQ被盗的原因及防范手段
· AutoCAD中“布局”的使用
[正文]
  我对与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\n",d.year,d.mon,d.day);

 gettime(&t); /* 调用此共享函数 */
 printf("当前时间: %02d:%02d:%02d\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;
}

天极社区邀请您:写博客日记  上传相片   论坛聊天  订阅电子杂志  推荐网摘   免费图铃工具
笔名:   请您注意:

 遵守国家有关法律、法规,尊重网上道德,承担一切因您的行为而直接或间接引起的法律责任。

 天极网拥有管理笔名和留言的一切权利。
评论:
 
发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容焦点新闻
  • 在C++中创建并使用Web服务
  • 利用C++模板编写的序列化框架
  • C语言高效编程的的四大绝招
  • C++高质量编程点滴
  • C++中用vectors改进内存的再分配
  • 联想回应客户流失说:通用投戴尔在收购之前
  • WAPI冲击国际标准再遇挫 国外集团设置障碍
  • 联想收购悬而未决 IBM新广告回抢PC客户
  • Verizon收购MCI遇阻 奎斯特竞购机会再现
  • 联电曹兴诚炮轰张汝京 中芯副总裁不予置评
  • 网通将携电盈开发内地 电信合作藏地产野心
  • 众多新浪员工对盛大入主新浪持乐观态度
  • Forrester总裁:我能在27秒内放弃Google
  • Advertisement

    天极无线


    奇妙科幻|美好风光|清风车影|漫画卡通|星座生肖|明星写真|动物世界
    老鼠爱大米
    挥着翅膀的女孩
    女人味
    栀子花开
    白月光
    刚刚好
    江南
    快乐崇拜
    亲爱的你怎么不在我身边
    小薇
    2002年的第一场雪
    有多少爱可以重来
    我的地盘
    七里香
    情人
     
    老鼠爱大米 老板电话
    冲动的惩罚 七里香
    我不是黄蓉 女生撒娇
    盛夏的果实 坚持到底
    孤单北半球 眉飞色舞
    挪威的森林 可爱女人
    最浪漫的事 老板电话

    CSEEK搜索