动态库;如何修复无用的依赖项?

时间:2011-12-05 23:20:14

标签: c++

我的项目中有一堆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中?我不是软件设计专家,但在这种情况下,解耦越多越好。 希望我的解释足够好。

1 个答案:

答案 0 :(得分:0)

如果您在ImageLoaderDll中使用MyMacroDll的DLL接口,则执行具有依赖关系。 ImageLoaderDll应包含_MyMacroDll.h,否则您无法正确调用其功能。当您想要致电<string.h>时,它与包含strlen完全相同。