c2011类型重定义错误,或非私有成员的c4677签名包含程序集私有类型

时间:2013-11-18 11:58:18

标签: .net dll c++-cli .net-assembly

我有一个编译问题,类似于这个:stackoverflow q2977534,我得到了c2011类型的重定义错误。

让我描述一下我的情况:
我有typesgeneral.h(包含public ref class CLocationprivate enum class EnumParamType和其他内容),其中包含许多其他.h文件,例如CDrive.hCIOSystem.hCTcpipConnection.hCIOSystem.h还包括CTcpipConnection.h。所有文件(及其cpp实现)都是一个大型项目的一部分。到目前为止没问题。

我最近决定将属于一起的文件分组并创建托管DLL,每个DLL包含具有相似目的的所有文件,例如:

swcore_network.dll:  
  CTcpipConnection.cpp, includes:
    CTcpipConnection.h, includes:
      typesgeneral.h, defines CLocation
  CUdpipConnection.cpp, includes
    CUdpipConnection.h, includes
      typesgeneral.h, defines CLocation
  CWnetShare.cpp ...

typesgeneral.h包含在所有.h文件中,因为它包含#pragma once,因此包含正在运行。但同样的文件也包含在其他.h文件中(CIOSystem.h,...),构建另一个DLL

swcore_io.dll:
  CIOSystem.cpp, includes
    CIOSystem.h, includes
      typesgeneral.h, defines CLocation
  CIOModuleType1.cpp, includes
    CIOModuleType1.h, includes
      typesgeneral.h, defines CLocation
  ...
  Reference to swcore_network.dll

问题#1:来自CLocation的{​​{1}}现在在typesgeneral.h引用了两次,因为它是公开的,因此它也是swcore_io.dll界面的一部分。因此我得到错误c2011。 #pragma曾经没有帮助,因为有不同的编译过程 解决方案#1:我已将swcore_network.dll中的所有类设为私有,因此只有主类构建DLL接口。

问题#2:我有其他带有公共函数的类,它带有typesgeneral.h参数。 CLocation是私有的。这就是为什么我收到警告C4677:非私人成员包含私人类型。
问题#2 :(已通过测试回答)我是否能够访问这些功能?我猜不是......? 解决方案#2:虽然我没想到它会起作用,但似乎。很明显,编译器足够聪明,可以识别符号是在不同的位置定义的,但它是相同的......也许有人可以向我解释发生了什么。

问题3:如果我公开了CLocation,那么我将不得不删除引用已导入符号的所有包含。现在想想2个独立的DLL,它们都包含CLocation,然后我在我的应用程序中包含这两个DLL 问题3:可能与否?我是否有2个不同的符号同名并得到编译器错误?

一般问题: 是否有更优雅的方法来创建彼此依赖的DLL之间的多个? 制作一个包含所有内容的大型DLL除外? 或继续在目标项目中包含每个所需的.h和.cpp并始终编译所有内容?

在找到更好的解决方案之前,我将使用我的解决方案并禁止编译器警告c4677(http://msdn.microsoft.com/en-us/library/vstudio/jj715718.aspx)。

0 个答案:

没有答案