0

我在 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。

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

4

1 回答 1

2

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

mydll.h

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

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

类A.h

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

A类.cpp

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

B类.h

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

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

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

于 2013-06-28T07:10:10.980 回答