我的项目中有一堆Dll,使用VStudio 9.0编译器,预编译的标题用于我的所有Dll。 dll的加载过程由隐式调用者完成(.dll,.lib和头必须提供)。
我通常会为每个dll创建一个不同的宏定义文件,例如,如果我当前的Dll被称为MYMacroDll,我添加了一个文件 _MyMacroDll.h ,其中包含:
#ifndef _MYMACRODLL_H_
#define _MYMACRODLL_H_
#ifdef _WIN32
#ifdef MYMACRODLL_EXPORTS
#define MYMACRODLL_API __declspec(dllexport)
#else
#define MYMACRODLL_API __declspec(dllimport)
#endif
#define MYMACRODLL_CALL __cdecl
#else
#define MYMACRODLL_API
#define MYMACRODLL_CALL
#endif
#endif
我知道代码可以简化,但我保留了可移植性的最后定义,至少,这是我理解的......
预编译的头文件 pch.h ,将始终包含宏定义文件 _MyMacroDll.h ,这会让事情变得更容易,因为以后我可以决定是否接口新类或函数。到目前为止这是正确的。
混淆来自于在另一个dll中使用dll接口;让我们假设第二个dll ImageLoaderDll 。这个使用_MyMacroDll中一个(或几个)接口类/函数的实例或引用。乍一看,我猜测不需要包含_MyMacroDll.h,但在编译ImageLoaderDll时它会抱怨
error C2470: '_AnInterfaceClassFromMyMacro' : looks like a function definition, but there is no parameter list; skipping apparent body
然后我必须在另一个Dll的预编译器头文件中包含_MyMacroDll.h,我的项目变得非常混乱,我发现越来越多无用的依赖项。 怎么了?是否有另一种设置宏定义的方法,以便我可以避免将其添加到客户端Dll中?我不是软件设计专家,但在这种情况下,解耦越多越好。 希望我的解释足够好。
答案 0 :(得分:0)
如果您在ImageLoaderDll中使用MyMacroDll的DLL接口,则执行具有依赖关系。 ImageLoaderDll
应包含_MyMacroDll.h
,否则您无法正确调用其功能。当您想要致电<string.h>
时,它与包含strlen
完全相同。