我有一个编译问题,类似于这个:stackoverflow q2977534,我得到了c2011类型的重定义错误。
让我描述一下我的情况:
我有typesgeneral.h
(包含public ref class CLocation
,private enum class EnumParamType
和其他内容),其中包含许多其他.h文件,例如CDrive.h
,CIOSystem.h
和CTcpipConnection.h
。 CIOSystem.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)。