国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > 综合技术 > ACE_Export

ACE_Export

来源:程序员人生   发布时间:2014-10-10 08:00:01 阅读次数:2838次

     不得不佩服ACE的跨平台强大之处

     如果你需要在Windows下创建dll项目供其他项目使用。

     你创建dll项目的代码要导出才能被外部访问,这个是由于Windows的动态链接库默认访问级别为私有导致的,所以只有导出的接口才会被外部访问。

     在你打算导出的时候只需要使用ACE自带的导出宏即可:

头文件应该像这个样子:

#ifndef CONFIGLOADER_H #define CONFIGLOADER_H #include "ace/Log_Msg.h" class ACE_Export ConfigLoader { public: ConfigLoader(void); ~ConfigLoader(void); void load_from_file(void); void load_from_db(void); }; #endif


源文件正常,无需任何变动:

/************************************************************************/ /* 配置加载类 */ /************************************************************************/ #include "ConfigLoader.h" ConfigLoader::ConfigLoader(void) { } ConfigLoader::~ConfigLoader(void) { } void ConfigLoader::load_from_db(void) { ACE_DEBUG((LM_DEBUG,"ConfigLoader::load_from_db(void) run")); } void ConfigLoader::load_from_file(void) { ACE_DEBUG((LM_DEBUG,"ConfigLoader::load_from_file(void) run")); }

但是我发现当有继承关系的时候,尤其是基类是抽象基类但也要导出的时候,比如有virtual函数的时候这种方式就不行了,要用下面的这种方式:

#ifndef COMMUNICATER_H #define COMMUNICATER_H #include "ace/ACE_export.h" class Communicater { public: ACE_Export Communicater(void); ACE_Export virtual void run_collect() = 0; ACE_Export virtual ~Communicater(void); }; #endif

其等价于下面的方式:

#ifndef COMMUNICATER_H #define COMMUNICATER_H //#include "ace/ACE_export.h" #ifdef COMMUNICATER_EXPORTS #define COMMUNICATER_API __declspec(dllexport) #else #define COMMUNICATER_API __declspec(dllimport) #endif class Communicater { public: COMMUNICATER_API Communicater(void); COMMUNICATER_API virtual void run_collect() = 0; COMMUNICATER_API virtual ~Communicater(void); }; #endif



反正就是要对每个接口单个导出,而不是导出类,不知道为何


即可编译生成dll,供其他项目使用,多棒!

具体操作参考:http://blog.csdn.net/calmreason/article/details/6989390中官方网站教程(主要是VC++工程的“项目引用”功能 )

 

生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生