DLLをリンクしようとしていますが、常に問題が発生していUINT32
ます。
ライブラリは、VisualStudioコンパイラの4.1バージョンに対してコンパイルされます。私のコンポーネントのインターフェース(4.1でしたが、現在は2012に移植しています)は、多くUINT32
のsが含まれている状態で定義されています。VC4.1ではUINT32
、コンパイラーによって定義されていないためunsigned long
、プログラマーによってtypedefされましたが、VC6以降UINT32
はとして定義されていunsigned int
ます。これは私の人生を困難にします。
UINT32
私の最初の反応は、インターフェイスのすべてを置き換えてunsigned long
再コンパイルすることでした。関数のシグネチャが同じであるため、これは機能します。ただし、unsigned long
2012年のは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を定義しています。