此文章纯属自己记性不好记录用,勿喷。。。。
下面记录的是关闭vs2010导出类,以及导出类后的使用问题,由于有继承,导出类中包含动态库,所以记录以便以后查阅。
#ifndef _EXPORTING #define _EXPORTING #endif #ifdef _EXPORTING #define API_DECLSPEC __declspec(dllexport) //导出 #else #define API_DECLSPEC __declspec(dllimport) //导入 #endif class API_DECLSPEC CClass_Repeat_Interface { public: private: public: ClassRepeatEventIndex m_ClassRepeatEventIndex; //整个class的索引文件表 CClass_Repeat_HttpDownLoad_Extension1 * m_pHttpDownLoad_Extension1 ; //扩展1下载对象 CClass_Repeat_Play * m_p_Play; //整个class的播放对象 CClass_Repeat_Play_Media m_p_Play_Media[MAXMEDIAENTRY]; //音视频播放对象 数组 private: };
一:
上面是接口类,类中的成员函数分为三种:
1:结构体,这里不记录无关紧要如:ClassRepeatEventIndex m_ClassRepeatEventIndex; //整个class的索引文件表
2:类指针,如:CClass_Repeat_HttpDownLoad_Extension1 * m_pHttpDownLoad_Extension1 ; //扩展1下载对象
3:类对象,如:CClass_Repeat_Play_Media m_p_Play_Media[MAXMEDIAENTRY]; //音视频播放对象 数组
其中的类指针如下:
这里不用加导出标志“API_DECLSPEC”。
class CClass_Repeat_HttpDownLoad_Extension1 : public CClass_Repeat_HttpDownLoad { public: CClass_Repeat_HttpDownLoad_Extension1(); virtual ~CClass_Repeat_HttpDownLoad_Extension1(); //下载扩展数据 virtual int ClassRepeatDownLoad(const char * url, void * table); //解析扩展数据 virtual int ClassRepeatPars(void * data); private: //将下载到的内容放到各自的索引表结构体中具体处理函数 //这里定义成static static int HttpDownLoadExtension1Proc(char * data, int datasize,void * table,OutParameterlist * noutparalist); public: private: };
其中类对象如下:
这里需要加导出标志“API_DECLSPEC”。
class API_DECLSPEC CClass_Repeat_Play_Media : public CClass_Repeat_Play { public: private: public: CClass_Repeat_Play_Media(); CMediaDecoder m_MediaDecoder; //解码对象 int MeidaChannel; //机位号 CPlayAudio m_playSound; //音频渲染用directsound private: };
也需要加上导出标志“API_DECLSPEC”。
还有继承的类如:class API_DECLSPEC CClass_Repeat_Play_Media : public CClass_Repeat_Play
也需要加上导出标志“API_DECLSPEC”。
下面是两个类的情况
类:CMediaDecoder
class API_DECLSPEC CMediaDecoder { public: CMediaDecoder(); ~CMediaDecoder(); private: bool m_bVideoDecodeInitOK; bool m_bAudioDecodeInitOK; };
class API_DECLSPEC CClass_Repeat_Play { public: CClass_Repeat_Play(); virtual ~CClass_Repeat_Play(); private: };
二:
下面是关于生成的动态库中包含了动态库,在工程中c/c++,链接器怎么配置问题
1:要生成的动态库例如叫"B",它自己包含的动态库叫“A”:
需要包含A的include路径,A的lib路径和A的lib文件
2:exe程序应用生成的动态库的工程
需要包含A的include路径,B的include路径,和B的lib路径和B的lib文件,并将A的dll文件和B的dll文件放到可执行文件同级目录中。
//如果是导出库需要将此lib 添加到:链接器->输入->附加依赖项中,否则出错
例如:
#ifdef _EXPORTING //如果是导出库需要将此lib 添加到:链接器->输入->附加依赖项中,否则出错 #else #pragma comment(lib,"tinyxml.lib") #endifhttp://blog.csdn.net/flyer_2001/article/details/42612399 看这个链接。
三:
1:如果生成的动态库有相对路径,exe程序包含了生成的动态库,则这个相对路径是相对于exe程序的。