командный файл — ошибка компоновщика при установке реализации MessagePack для C и переполнения стека

я следую инструкции, которые говорят мне скачать msgpack 0.5.4 для C & C ++.

В Windows загрузите исходный пакет отсюда и распакуйте его. Откройте файл msgpack_vc8.vcproj или msgpack_vc2008 и соберите его с помощью пакетной сборки. Он собирает библиотеки в lib / folder и заголовочные файлы в include / folder.

Вы можете построить с помощью командной строки следующим образом:

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

В распакованном.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, это тоже будет полезно. Заранее спасибо. 🙂

1

Решение

Вам необходимо связать библиотеку ws2_32.lib, поскольку ntohl — это функция API winsocket.

Это должно решить проблему!

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]