谈跨平台C 动态连接库的实现
2008-02-23 05:24:30来源:互联网 阅读 ()
本列主要实现了一个动态库和一个调用动态库的运行程式,动态库包括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 中建立对象间消息连接的系统方法
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash