VS2008链接错误在64位模式下使用SafeInt3.hpp

时间:2010-06-03 16:51:57

标签: c++ visual-studio-2008 64-bit linker

我有以下代码链接并在32位模式下正常运行 -

#include "safeint3.hpp"
typedef SafeInt<SIZE_T> SAFE_SIZE_T;
SAFE_SIZE_T sizeOfCache;
SAFE_SIZE_T _allocateAmt;

其中safeint3.hpp是可在Codeplex SafeInt上找到的最新版本。对于那些不知道它的人来说,safeint是一个模板类,它使得处理不同的整数类型和大小“安全”。在软件上引用第9频道的视频 - “它会编写你应该编写的代码”。

这是我的情况。我有一个类管理一个大的内存中的对象缓存(> 6gb),我非常担心确保我的指针/大小/其他整数变量没有溢出/下溢问题。在这种用途中,它解决了许多问题。

从32位开发模式转移到64位生产模式时,问题就出现了。当我在这种模式下构建应用程序时,我收到以下链接器警告 -

1>cachecontrol.obj : warning LNK4006: "bool __cdecl IntrinsicMultiplyUint64(unsigned __int64 const &,unsigned __int64 const &,unsigned __int64 *)" (?IntrinsicMultiplyUint64@@YA_NAEB_K0PEA_K@Z) already defined in ImageInRamCache.obj; second definition ignored
1>cachecontrol.obj : warning LNK4006: "bool __cdecl IntrinsicMultiplyInt64(__int64 const &,__int64 const &,__int64 *)" (?IntrinsicMultiplyInt64@@YA_NAEB_J0PEA_J@Z) already defined in ImageInRamCache.obj; second definition ignored

虽然我明白我可以忽略错误,但我希望(a)防止警告发生或(b)使其消失,以便我的QA部门不会将其标记为问题。在花了一些时间研究之后,我找不到办法。

3 个答案:

答案 0 :(得分:0)

这些函数是否在头文件中声明和定义,并且没有任何机会声明为inline

看起来它们是准内联的,但符号在目标文件外部是可见的,它们不应该是。

如果是这种情况,只需将其声明为inline即可解决问题。

答案 1 :(得分:0)

关于禁用警告的问题,我们应该这样做:

#pragma warning(disable:4006)

答案 2 :(得分:0)

问题是在safeint3.hpp中,代码如下所示:

bool IntrinsicMultiplyUint64( const unsigned __int64& a, const unsigned __int64& b, unsigned __int64* pRet )
{
    ....
}

这意味着包含safeint3.hpp的每个翻译单元都将获得IntrinsicMultiplyUint64的定义。如果您愿意修改该文件,可以将这些函数内联:

inline bool IntrinsicMultiplyUint64( const unsigned __int64& a, const unsigned __int64& b, unsigned __int64* pRet )
{
    ....
}