1

我正在按照说明下载msgpack 0.5.4 for C & C++

在 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 会得到相同的结果,所以我将从现在开始为它们说话。

项目转换后,我注意到项目设置为输出到 .lib,而不是 .dll,因此我更改了该设置以满足我的需要。编译时出现一个小错误:

...\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

1

您需要链接 ws2_32.lib 库,因为 ntohl 是一个 winsocket API 函数。

那应该可以解决问题!

于 2014-02-11T11:05:29.003 回答