1

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 を取得する別の方法があれば、それも役に立ちます。前もって感謝します。:)

4

1 に答える 1