C & C++ 用の msgpack 0.5.4をダウンロードするよう指示されている指示に従っています。
Windows では、ここからソース パッケージをダウンロードして展開します。msgpack_vc8.vcproj または msgpack_vc2008 ファイルを開き、バッチ ビルドを使用してビルドします。ライブラリは lib/ フォルダーに、ヘッダー ファイルは include/ フォルダーにビルドされます。
次のようにコマンドラインを使用してビルドできます。
vcbuild msgpack_vc2008.vcproj
dir lib % DLL files are here
dir include % header files are here
vcbuild msgpack_vc2008.vcproj は、MSBuild msgpack_vc8.vcxproj に置き換えられました。Visual Studio 2012 を使用してプロジェクトを変換し、このための正しい .vcxproj を作成しました。Visual Studio でのバッチ ビルドと MSBuild の実行では同じ結果が得られるため、この時点から両方について説明します。
プロジェクトを変換した後、プロジェクトが .dll ではなく .lib に出力するように設定されていることに気付いたので、必要に応じてその設定を変更しました。コンパイル時に小さなエラーが 1 つありました。
...\microsoft visual studio 11.0\vc\include\stdint.h(8): error C2371: 'int8_t' : redefinition; different basic types
...msgpack-0.5.4\src\msgpack\sysdep.h(23) : see declaration of 'int8_t'
だから私は行を変更しました
typedef __int8 int8_t;
に
typedef signed __int8 int8_t;
その小さな問題を解決します。しかし、その後、私が今いる場所に到着します。このリンカ エラー:
objectc.obj : error LNK2019: unresolved external symbol __imp__ntohl@4 referenced in function _msgpack_pack_array
unpack.obj : error LNK2001: unresolved external symbol __imp__ntohl@4
objectc.obj : error LNK2019: unresolved external symbol __imp__ntohs@4 referenced in function _msgpack_pack_array
unpack.obj : error LNK2001: unresolved external symbol __imp__ntohs@4
...\msgpack-0.5.4\Debug\MessagePack.dll : fatal error LNK1120: 2 unresolved externals
このエラーの一部を検索しました:
sysdep.h で:
#define _msgpack_be16(x) ntohs(x)
#define _msgpack_be32(x) ntohl(x)
object.c で:
case MSGPACK_OBJECT_ARRAY:
{
int ret = msgpack_pack_array(pk, d.via.array.size);
if(ret < 0) { return ret; }
msgpack_object* o = d.via.array.ptr;
msgpack_object* const oend = d.via.array.ptr + d.via.array.size;
for(; o != oend; ++o) {
ret = msgpack_pack_object(pk, *o);
if(ret < 0) { return ret; }
}
unpack.c で:
static inline int template_callback_array(unpack_user* u, unsigned int n, msgpack_object* o)
{
o->type = MSGPACK_OBJECT_ARRAY;
o->via.array.size = 0;
o->via.array.ptr = (msgpack_object*)msgpack_zone_malloc(u->z, n*sizeof(msgpack_object));
if(o->via.array.ptr == NULL) { return -1; }
return 0;
}
そして、それは私が知っているすべてです。.dll を取得する別の方法があれば、それも役に立ちます。前もって感謝します。:)