UINT32编译器版本不匹配 - 链接到旧库

时间:2012-11-06 12:23:52

标签: c++ linker uint32

我正在尝试关联DLL,但我不断遇到UINT32的问题。

该库是根据Visual Studio编译器的4.1版本编译的。我的组件的接口(4.1和我现在移植到2012)定义了许多UINT32 s。在VC4.1中,UINT32未由编译器定义,因此程序员将其{i}类型定义为unsigned long,但从VC6开始UINT32定义为unsigned int。这让我的生活变得艰难。

我最初的反应是尝试用UINT32替换接口中的所有unsigned long并重新编译。这有效,因为功能签名是相同的。但是,2012年的unsigned long是64位宽...而不是32位。在大多数情况下这不是问题,但我预见到标志参数和返回类型可能存在问题。

我想知道的是,如果我错过了一个更明显的解决方案。我想过定义一个不同的类型

typedef OAM_UINT32 unsigned long //in the library
typedef OAM_UINT32 unsigned int // in my component

但问题与我对UINT32的两个定义已经存在的问题是一样的......对吗?

非常感谢任何帮助。

问题

客户端代码

#include <oam_if.h>
....
UINT32 uuid = getSomeLocalUserId();
UINT32 dwOamRetVal = dwOamGetUserDetails( uuid ); // LINK ERROR: Symbol not found

oam_if.h

UINT32 dwOamGetUserDetails( UINT32 idOfUser );

编译库(OAM)时,UINT32值被评估为unsigned long。编译客户端组件时,UINT32的计算结果为unsigned int。链接器抱怨是因为它在OAM库中为dwOamGetuserDetails定义了一个符号,它耙起并返回一个unsigned long,但是客户端正在调用一个根据它应该采用unsigned int的函数。

因此,虽然它们各自的输入都是32位长的无符号数,但函数的签名是不同的,并且链接器会抱怨。

我能看到修复它的唯一方法是直接将所有内容定义为unsigned long。但是,OAM将使用32位长数字,但客户端将使用64位数字!

链接器错误示例

  

错误LNK2001:未解析的外部符号“public:virtual unsigned long __thiscall Message :: getCallId(void)const”(?getCallId @ Message @@ UBEKXZ)oam.lib(OAM_SsRequest.obj)

这实际上是从库到组件的回调,因此在这种情况下,它正在查找与libary(unsigned long)定义的UINT32匹配的签名,但组件为其回调定义了unsigned int。 / p>

0 个答案:

没有答案