ACE_Export
來源:程序員人生 發(fā)布時間:2014-10-10 08:00:01 閱讀次數(shù):2992次
不得不佩服ACE的跨平臺強大之處
如果你需要在Windows下創(chuàng)建dll項目供其他項目使用。
你創(chuàng)建dll項目的代碼要導(dǎo)出才能被外部訪問,這個是由于Windows的動態(tài)鏈接庫默認訪問級別為私有導(dǎo)致的,所以只有導(dǎo)出的接口才會被外部訪問。
在你打算導(dǎo)出的時候只需要使用ACE自帶的導(dǎo)出宏即可:
頭文件應(yīng)該像這個樣子:
#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"));
}
但是我發(fā)現(xiàn)當有繼承關(guān)系的時候,尤其是基類是抽象基類但也要導(dǎo)出的時候,比如有virtual函數(shù)的時候這種方式就不行了,要用下面的這種方式:
#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
反正就是要對每個接口單個導(dǎo)出,而不是導(dǎo)出類,不知道為何
即可編譯生成dll,供其他項目使用,多棒!
具體操作參考:http://blog.csdn.net/calmreason/article/details/6989390中官方網(wǎng)站教程(主要是VC++工程的“項目引用”功能 )
生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機掃描二維碼進行捐贈