谈跨平台c++动态连接库

来源:互联网 发布:淘宝 优惠券 编辑:程序博客网 时间:2024/06/03 08:50

我对与solaris ,hp ,windows这三个平台的动态库的实现,进行了探索,对于soloaris,hpUnix平台来讲,主要是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库了.

别的方面比较简单,具体可以看附件 crossdll2.rar

====
没有发现附件在何处贴,只好copy部分代码在此
需要crossdll2.rar完整代码email联系我

//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;
 }

原创粉丝点击