Проблема с компоновщиком в ZeroMQ и Visual C ++ 2008 - PullRequest
4 голосов
/ 16 июля 2011

У меня проблема с попыткой использования ZeroMQ в моем новом приложении. Обратите внимание: у меня нет проблем с загрузкой и сборкой самого ZeroMQ. Я скачал ZeroMQ ZIP-файл, открыл файл проекта / решения в Visual Studio / C ++ 2008 и прекрасно скомпилировал библиотеку ZeroMQ. В каталоге / lib папки установки ZeroMQ содержатся .lib, .dll и другие файлы, поэтому, насколько я знаю, все в порядке.

Моя проблема в том, что я пытаюсь создать простой проект, состоящий из примера сервера HelloWorld в руководстве пользователя ZeroMQ. Я создал следующий файл с именем helloserver.c.

//
// Hello World server
// Binds REP socket to tcp://*:5555
// Expects "Hello" from client, replies with "World"
//
#include <zmq.h>
#include <stdio.h>
#include <string.h>

int main (void)
{
zmq_msg_t request;
zmq_msg_t reply;

void *context = zmq_init (1);

// Socket to talk to clients
void *responder = zmq_socket (context, ZMQ_REP);
zmq_bind (responder, "tcp://*:5555");

while (1) {
// Wait for next request from client

    zmq_msg_init (&request);
    zmq_recvmsg (responder, &request, 0);
    printf ("Received Hello\n");
    zmq_msg_close (&request);

// Do some 'work'
    Sleep (1);

// Send reply back to client
    zmq_msg_init_size (&reply, 5);
    memcpy (zmq_msg_data (&reply), "World", 5);
    zmq_sendmsg (responder, &reply, 0);
    zmq_msg_close (&reply);
}
// We never get here but if we did, this would be how we end
zmq_close (responder);
zmq_term (context);
return 0;
}

Я добавил каталог включения установки ZeroMQ в путь включения VC ++ 2008 (Свойства-> Свойства конфигурации-> C / C ++ -> Общие-> Дополнительные каталоги включения) и также добавил в проект каталог библиотеки ZeroMQ: (Свойства-> Свойства конфигурации-> C / C ++ -> Генерация кода-> Библиотека времени выполнения, выбрана многопоточная отладка DLL / MDd).

Я пытался построить проект. Все компилируется нормально, но я получаю кучу неразрешенных внешних ссылок, таких как эта:

1> Linking ... 1> helloserver.obj: ошибка LNK2019: неразрешенный внешний символ _ imp _zmq_term, указанный в функции _main 1> helloserver.obj: ошибка LNK2019: неразрешенный внешний символ _ imp _zmq_close, на который ссылается функция _main 1> helloserver.obj: ошибка LNK2019: неразрешенный внешний символ _ imp _zmq_sendmsg, на который ссылается функция _main 1> helloserver.obj: ошибка LNK2019: неразрешенный внешний символ _ imp _zmq_msg_data, указанный в функции _main 1> helloserver.obj: ошибка LNK2019: неразрешенный внешний символ _ imp _zmq_msg_init_size, указанный в функции _main 1> helloserver.obj: ошибка LNK2019: неразрешенный внешний символ _ imp _zmq_msg_close, указанный в функции _main 1> helloserver.obj: ошибка LNK2019: неразрешенный внешний символ _ imp _zmq_recvmsg, на который ссылается функция _main 1> helloserver.obj: ошибка LNK2019: неразрешенный внешний символ _ imp _zmq_msg_init, указанный в функции _main 1> helloserver.obj: ошибка LNK2019: неразрешенный внешний символ _ imp _zmq_bind, указанный в функции _main 1> helloserver.obj: ошибка LNK2019: неразрешенный внешний символ _ imp _zmq_socket, указанный в функции _main 1> helloserver.obj: ошибка LNK2019: неразрешенный внешний символ _ imp _zmq_init, указанный в функции _main 1> C: \ work \ visualc ++ 2008 \ projects \ HelloZMQServer \ Debug \ HelloZMQServer.exe: фатальная ошибка LNK1120: 11 неразрешенных внешних проблем

Я попытался вернуться к настройкам библиотеки «Генерация кода» -> «Runtime» и попытался изменить переключатель библиотеки на «MD» или «/ MT», но ничего не получилось, я все еще получаю эти ошибки компоновщика.

Обратите внимание, что когда я создавал helloworld.c, я использовал пустой проект консольного приложения для Windows, и единственные изменения, которые я сделал, - это добавление ZeroMQ include и lib, как указано выше. Я не изменил другие настройки проекта по умолчанию. Я предполагаю, что где-то пропустил настройку проекта.

Как я могу это исправить?

Ответы [ 3 ]

6 голосов
/ 30 декабря 2013

Когда я получил похожие ошибки, это было потому, что я пытался связать 64-битные библиотеки в 32-битный проект. Я скачал не ту версию. Когда я получил правильные, то есть x86 вместо x64, это сработало.

4 голосов
/ 25 ноября 2011

Добавить путь к библиотеке ZMQ (Путь, в котором установлены библиотеки ZMQ \ zeromq-2.1.10 \ lib) к вашему проекту:

Project-> Properties-> Linker-> General-> Дополнительные каталоги библиотек

Также добавьте libzmq.lib в

Project-> Properties-> Linker-> Input-> Дополнительные зависимости

Забавно, вам нужна копия libzmq.dll в вашем проекте, в противном случае, когда вы запустите ваш проект, отладчик будет жаловаться «Не удалось найти libzmq.dll». Все еще в поисках обходного пути.

Примечание. Это то, что я использовал для запуска своего кода zmq в Visual Studio 2010. Должно работать и для VS 2008.

2 голосов
/ 03 августа 2011

Вы не упомянули, что также добавили конкретную библиотеку в свой проект. Обратите внимание, что недостаточно указать VS только путь к lib, но вы также должны добавить саму lib в ваш проект. У меня сейчас нет Visual Studio под рукой, но вы найдете эту опцию в настройках компоновщика проекта. Там вы можете указать все библиотеки, с которыми хотите связать.

...