不得不佩服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++工程的“项目引用”功能 )