VS制作动态库注意事项

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_38126105/article/details/85145575
  1. 导出函数
    当我们需要导出函数的时候,应该考虑的是以标准调用约定(stdcall)的形式提供给用户。具体的调用约定的区别可以参考下文。
    https://blog.csdn.net/chenlycly/article/details/51329886
    在接口声明文件中,我们需要定义个用来做导入导出开关的宏,再做一个标准调用约定的宏。当需要导出的时候,我们只需要在前面加一个MYAPI_DLL就可以了,导入的时候,什么都不需要改变,直接使用引入接口声明文件,对应的dll,lib就可以了。
#ifdef MYAPI_DLL
	#define MYAPI extern "C" _declspec(dllexport)
#else
	#define MYAPI extern "C" _declspec(dllimport)
#endif
    #ifdef WIN32
    	#define STDCALL         __stdcall //需要注意的时,_stdcall是会改名的,我们是可以通过depend看出的,_cdecl不会改名的,如果不想换名的话,还需要借助.def文件
    #else
    	#ifdef i386
    		#define STDCALL         __attribute__((stdcall))
    	#else
    		#define STDCALL
    	#endif
    #endif
    
    MYAPI int STDCALL Add(int a, int b);
    
    MYAPI int STDCALL Subtrac(int a, int b);

在建一个.def文件

LIBRARY Dll3 //导出的动态库库名

EXPORTS

Add			//导出的函数名
Subtrac

需要注意的是def文件需要在配置工程里面进行设置
在这里插入图片描述

  1. 导出类
    导出的类的方法和导出函数差不多.类中函数的权限依然有效
	class _declspec(dllexport) A
	{
	};
	/*需要导出只导出几个成员函数时,需要在成员函数前加上_declspec(dllexport)就可以
	了,但是导出类的时候,我们需要考虑下,最好将接口和实现分离,即pImple.*/
	
	class A;//前置声明
	calss _declspec(dllexport) A
	{
		A:a(new A)(){} //构造时生成对应的实现类的实例
		~A(){delete a} //析构时删除
		void Open() { a->Open();}//本身不实现,通过实现的实例调用
		void Close() {a->Close();}
		private:
		ImA *a;
	};
calss ImA 
{
	publice:
	void Open(){}
	void Close() {}
	private:
	void kkkk(){}
	int m_name;
}
/*这么做的好处有:一是,一个类是有权限的,这样的话我们可以将实现中的类私有权限和
保护权限的成员函数和成员不必再暴露给用户,安全和便于用户使用。二是,这样将实现进
行了屏蔽,我们实现发生了变化,不会对用户产生影响。

猜你喜欢

转载自blog.csdn.net/m0_38126105/article/details/85145575
今日推荐