我正在尝试链接一个 DLL,但我经常遇到UINT32
.
该库是针对 4.1 版本的 Visual Studio 编译器编译的。我的组件的接口(它是 4.1,我现在正在移植到 2012)在UINT32
其中定义了许多 s。在 VC4.1UINT32
中不是由编译器定义的,因此它是unsigned long
由程序员定义的,但从 VC6 开始,UINT32
它被定义为unsigned int
. 这让我的生活变得艰难。
我最初的反应是尝试将UINT32
界面中的所有内容替换为unsigned long
并重新编译。这是因为函数签名是相同的。然而unsigned long
,2012 年的 a 是 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
rake 并返回一个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)
这实际上是从库到组件的回调,因此在这种情况下,它正在寻找与库(unsigned long)定义的 UINT32 匹配的签名,但组件正在为其回调定义一个 unsigned int。