将一个大文件分解为一个DLL的陷阱

Pitfalls for breaking up a large file into one DLL?

本文关键字:一个 DLL 陷阱 文件 分解      更新时间:2023-10-16

我在MSVC++2010中创建DLL的经验不多,只是作为学习曲线的一部分可能会有几次。目前,我有一个很大的文件,里面有大约10个不同的类。我必须将文件分解为多个文件,并将相关的类移到同一个文件中。所以在继续之前,我想从经验丰富的开发人员那里了解我的情况。

类似以下

// Header
namespace collections
{
 classA
 classB
 ClassC
 ClassD : ClassA,ClassB
}
// CPP
namespace collections
{
 classA
  {
      // Implementations
  }
 // Rest of the classes
}

分解为单独的文件后

// ClassA.h
namespace Collections
{
  ClassA
}
// ClassB.h
namespace Collections
{
  ClassB
}
// Implentations etc

我主要关心的是dllexport/dllimport存储类属性的使用由于文件将被破坏,我将不得不使用以下

#ifdef MAKEDLL
#  define EXPORT __declspec(dllexport)
#else
#  define EXPORT __declspec(dllimport)
#endif

根据类导出/导入它们。但是,将这些行放在将要创建的每个头文件中(带有一个命名空间"Collections"),这在编译或代码生成步骤时会有任何不良影响吗?我在网上浏览了一下,发现人们最抱怨的是链接器错误/警告,即在创建DLL时重新定义或找不到特定成员。这肯定是一个解决了的问题,只是我不知道哪种方法是最好和合适的。最后我只需要创建一个DLL。我不需要创建多个DLL。

非常感谢任何指导或帮助。感谢

有一个定义EXPORTS宏的通用头文件是没有问题的:

mydll.h

#ifdef MYDLL_EXPORTS
#define MYDLL_API __declspec(dllexport)
#else
#define MYDLL_API __declspec(dllimport)
#endif

并将此头文件包含在其他头文件中:

ClassA.h

#include "mydll.h"
namespace Collections
{
  class MYDLL_API ClassA {
    // ...
  }
}

ClassA.cpp

#include "ClassA.h"
// ...

ClassB.h

#include "mydll.h"
namespace Collections
{
  class MYDLL_API ClassB {
    // ...
  }
}

等等。您可以将所有这些文件(头文件和.cpp实现文件)放在一个DLL中,在DLL项目设置中定义MYDLL_EXPORTS(这是由VS2010 DLL向导自动完成的)。

这里没有什么奇怪的。你永远不会重新定义任何东西。您只需使用方便的MYDLL_API将一个decorator添加到所有DLL API类中。