C++ 为C和C安装MessagePack实现时发生链接器错误++;

C++ 为C和C安装MessagePack实现时发生链接器错误++;,c++,batch-file,visual-studio-2012,msbuild,messagepack,C++,Batch File,Visual Studio 2012,Msbuild,Messagepack,我在下面,它告诉我下载 在Windows上,从此处下载源程序包并将其解压缩。打开msgpack_vc8.vcproj或msgpack_vc2008文件,并使用批生成进行生成。它在lib/文件夹中构建库,在include/文件夹中构建头文件 您可以使用命令行生成,如下所示: vbuild msgpack_vc2008.vcproj已被MSBuild msgpack_vc8.vcxproj替换。我使用Visual studio 2012将项目转换为具有正确的.vcxproj。VisualStudio

我在下面,它告诉我下载

在Windows上,从此处下载源程序包并将其解压缩。打开msgpack_vc8.vcproj或msgpack_vc2008文件,并使用批生成进行生成。它在lib/文件夹中构建库,在include/文件夹中构建头文件

您可以使用命令行生成,如下所示:

vbuild msgpack_vc2008.vcproj已被MSBuild msgpack_vc8.vcxproj替换。我使用Visual studio 2012将项目转换为具有正确的.vcxproj。VisualStudio中的批处理构建和运行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;

解决了这个小问题。但我们到达了我现在的位置。此链接器错误:

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)
在对象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; }
        }

        

这就是我所知道的全部。如果有其他方法获得.dll,那也会很有帮助。提前谢谢。:)

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

这应该可以解决问题

#define _msgpack_be16(x) ntohs(x)
#define _msgpack_be32(x) ntohl(x)
    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; }
        }

        
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;
}