2013-05-21 25 views
0

我有一个VS10解决方案,其中包含2个具有相同名称功能的项目。链接器抱怨(抛出警告)关于第二个定义(同名的两个功能)越来越被忽略:Visual Studio解决方案与具有相同名称的功能的不同项目

warning LNK4006: "void __cdecl function_name(short *,class Bbox *,int,int,struct FILE_NAMES *,unsigned char *)" ([email protected]@[email protected]@[email protected]@[email protected]) already defined in XXX.lib(segment.obj); second definition ignored 

这将导致第二个项目(被忽略的一个)的函数的调用指向的功能第一个项目(因为定义被忽略)。

我的问题是:有没有什么办法可以避免/解决这个问题,除了重命名所有在两个项目中具有相同名称的函数?例如,通过将#if/pragma添加到我的头文件中,或者通过操作.obj文件。实际情况是,解决方案只需要编译过程中的两个项目中的一个,因此条件编译的一个简单方法非常好,但我的第一选择是将两个项目编译在一起。

回答

1

这违反了One Definition Rule,只表示一个定义的tempate,类型,函数或对象可能存在于整个程序中。要解决这个问题,要么通过名称或参数重载使这两个函数的签名具有唯一性,要么将它们放在不同的名称空间中,要么在使用两个库的同时使用条件编译。

+0

谢谢!你有条件编译的链接吗? – SMir

+1

[This](http://en.cppreference.com/w/cpp/preprocessor/conditional)关于CPPReference的页面应该让你开始。 –

+0

翻译单位是一个cpp文件,还是项目或整个解决方案?相同名称的功能驻留在两个不同的项目中。基于wiki页面,TU是一个cpp文件,在这种情况下,不同项目中的相同名称不应该成为问题。我完全错了吗? – SMir

相关问题