手机站
网通分站
电信主站
密 码:
用户名:
当前位置 : 主页>程序设计>C/C++>列表

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

来源:互联网 作者:west263.com 时间:2008-02-23
西部数码-全国虚拟主机10强!40余项虚拟主机管理功能,全国领先!双线多线虚拟主机南北访问畅通无阻!免费赠送企业邮局,.CN域名,自助建站480元起,免费试用7天,满意再付款! P4主机租用799元/月.月付免压金!
 我对和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;
}




文章整理:西部数码--专业提供域名注册虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

热点关注
IDC资讯 虚拟主机 域名注册 托管租用 vps主机 智能建站
网站运营 建站经验 策划盈利 搜索优化 网站推广 免费资源
网站联盟 联盟新闻 联盟介绍 联盟点评 网赚技巧
行业资讯 业界动态 搜索引擎 网络游戏 门户动态 电子商务 广告传媒
网络编程 Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术 Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷 Internet Explorer
网页制作 FrontPages Dreamweaver Javascript css photoshop fireworks Flash
程序设计 Java技术 C/C++ VB delphi
网络知识 网络协议 网络安全 网络管理 组网方案 Cisco技术
操作系统 Win2000 WinXP Win2003 Mac OS Linux FreeBSD
返回首页 |关于我们 | 联系我们 | 付款方式 | 创业联盟 | 价格总览 | 资讯中心 | 友情链接 | 网站地图 | 招贤纳士 | RSS