1

DLLをリンクしようとしていますが、常に問題が発生していUINT32ます。

ライブラリは、VisualStudioコンパイラの4.1バージョンに対してコンパイルされます。私のコンポーネントのインターフェース(4.1でしたが、現在は2012に移植しています)は、多くUINT32のsが含まれている状態で定義されています。VC4.1ではUINT32、コンパイラーによって定義されていないためunsigned long、プログラマーによってtypedefされましたが、VC6以降UINT32はとして定義されていunsigned intます。これは私の人生を困難にします。

UINT32私の最初の反応は、インターフェイスのすべてを置き換えてunsigned long再コンパイルすることでした。関数のシグネチャが同じであるため、これは機能します。ただし、unsigned long2012年のは64ビット幅です...32ビットではありません。これはほとんどの場合問題ではありませんが、フラグパラメータとリターンタイプで発生する可能性のある問題を予測しています。

私が疑問に思っているのは、これに対するより明白な解決策を見逃していないかどうかです。別のタイプを定義することを考えました

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

しかし、問題は、UINT32の2つの定義ですでに持っているものと同じになります...そうですか?

どんな助けでも大歓迎です。

問題

クライアントコード

#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)

これは実際にはライブラリからコンポーネントへのコールバックであるため、この場合、ライブラリによって定義されたUINT32(unsigned long)に一致する署名を探していますが、コンポーネントはそのコールバックに対してunsignedintを定義しています。

4

0 に答える 0