2011-07-16 5 views
4

Je rencontre un problème lors de l'utilisation de ZeroMQ dans ma nouvelle application. S'il vous plaît noter: je n'ai aucun problème à télécharger et à construire ZeroMQ lui-même. J'ai téléchargé le fichier ZIP ZeroMQ, ouvert le fichier projet/solution dans Visual Studio/C++ 2008 et construit la bibliothèque ZeroMQ très bien. Le répertoire/lib du dossier d'installation de ZeroMQ contient les fichiers .lib, .dll et autres, donc tout va bien là-bas pour autant que je sache.Problème de liaison avec ZeroMQ et Visual C++ 2008

Mon problème est que j'essaye de construire un projet simple comprenant l'exemple de serveur HelloWorld dans le guide de l'utilisateur de ZeroMQ. J'ai créé le fichier suivant appelé 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; 
} 

J'ai ajouté le installatiion ZeroMQ include au VC++ 2008 include_path (Propriétés-> Configuration Propriétés-> C/C++ -> Général-> supplémentaires include) et j'ai aussi ajouté le répertoire lib ZeroMQ au projet: (Propriétés-> Propriétés de configuration-> C/C++ -> Génération de code-> Bibliothèque d'exécution, DLL de mise au point multithread/MDd sélectionnée).

J'ai essayé de construire le projet. Tout compile bien Buti obtenir un tas de non résolues comme celui-ci externals lors de la liaison:

1> Liaison ... 1> helloserver.obj: LNK2019 d'erreur: symbole externe non résolu _ _zmq_term référencé imp en fonction _main 1> helloserver.obj: erreur LNK2019: symbole externe non résolu _ diablotin _zmq_close référencé dans la fonction _main 1> helloserver.obj: erreur LNK2019: symbole externe non résolu _ _zmq_sendmsg référencé imp dans la fonction _main 1> helloserver.obj: erreur LNK2019 : symbole externe non résolu _ imp _zmq_msg_data refe renced en fonction _main 1> helloserver.obj: erreur LNK2019: symbole externe non résolu _ _zmq_msg_init_size référencé imp dans la fonction _main 1> helloserver.obj: erreur LNK2019: symbole externe non résolu _ _zmq_msg_close référencé imp en fonction _main 1 > helloserver.obj: erreur LNK2019: symbole externe non résolu _ _zmq_recvmsg référencé imp dans la fonction _main 1> helloserver.obj: erreur LNK2019: symbole externe non résolu _ _zmq_msg_init référencé imp dans la fonction _main 1> helloserver.obj: erreur LNK2019: symbole externe non résolu _ imp _zm q_bind référencé dans la fonction _main 1> helloserver.obj: erreur LNK2019: symbole externe non résolu _ _zmq_socket référencé imp dans la fonction _main 1> helloserver.obj: LNK2019 d'erreur: symbole externe non résolu _ _zmq_init référencé imp en fonction _main 1> C: \ work \ visualC++ 2008 \ projets \ HelloZMQServer \ Debug \ HelloZMQServer.exe: erreur irrécupérable LNK1120: 11 externes non résolus

J'ai essayé de revenir aux paramètres de la bibliothèque de génération de code-> Runtime et j'ai essayé de changer le bibliothèque passer à? MD ou/MT mais rien n'a fonctionné, je reçois toujours ces erreurs de l'éditeur de liens.

Veuillez noter que lorsque j'ai créé helloworld.c, j'ai utilisé un projet d'application de console Windows vide, et les seules modifications que j'ai faites consistaient à ajouter les répertoires include et lib de ZeroMQ comme indiqué ci-dessus. Je n'ai modifié aucun autre paramètre de projet par défaut. Je suppose que je manque un projet quelque part.

Comment puis-je résoudre ce problème?

+0

Veuillez également noter que j'ai construit ZeroMQ en double-cliquant sur son propre fichier de solution, donc je l'ai construit comme sa propre solution séparée. Mon projet HelloWorld est dans sa propre solution HelloWorld. Ai-je besoin de mettre la bibliothèque ZeroMQ dans la même solution que HelloWorld pour la construire correctement? Si oui, comment puis-je faire cela? – Marc

+0

Oh, et oui j'ai déjà ajouté le chemin lib ZeroMQ à mon projet HellowOrld (Projet-> Références-> Ajouter un chemin). Je peux ajouter le chemin, mais la fenêtre Ajouter une nouvelle référence apparaît et n'a rien. – Marc

+0

OK J'ai réussi à faire fonctionner ceci en ajoutant le projet ZeroMQ libzmq dans ma nouvelle solution HelloWorld. J'ai finalement pu voir libzmq apparaître comme une référence que je pourrais ajouter dans la fenêtre Ajouter une nouvelle référence. Il lie maintenant ok. Est-ce vraiment le cas si on crée une solution dans VC++, on doit inclure le projet de bibliothèques externes dans cette solution, avec votre propre projet utilisateur? Cela me semble un peu idiot. – Marc

Répondre

2

Vous n'avez pas mentionné que vous avez également ajouté la bibliothèque concrète à votre projet. Notez qu'il ne suffit pas de dire VS uniquement le chemin de la librairie, mais vous devez aussi ajouter la lib elle-même à votre projet. Je n'ai pas Visual Studio en main pour le moment, mais vous trouverez cette option dans les paramètres de l'éditeur de liens du projet. Là vous pouvez mentionner toutes les bibliothèques que vous voulez lier.

4

Ajoutez le chemin de la bibliothèque ZMQ (chemin où libs ZMQ sont installés \ zeromq-2.1.10 \ lib) à votre projet:

Projet-> Propriétés-> Linker-> Général-> Bibliothèque D'autres répertoires

également ajouter à libzmq.lib

projet-> Propriétés-> Linker-> Input-> dépendances supplémentaires

drôle est, vous devez avoir une copie de libzmq.dll dans votre projet, d'autre lorsque vous exécutez votre projet, le débogueur se plaindre "Impossible de trouver libzmq.dll". Toujours à la recherche d'une solution de contournement.

Remarque: C'est ce que j'ai utilisé pour exécuter mon code zmq dans Visual Studio 2010. Cela devrait également fonctionner pour VS 2008.

6

Lorsque j'ai eu des erreurs similaires, c'était parce que j'essayais de lier les bibliothèques 64 bits dans un projet 32 ​​bits. J'avais téléchargé la mauvaise version. Quand j'ai eu les bons, c'est-à-dire x86 au lieu de x64, ça a marché.

+0

C'était aussi la solution pour moi. Je pense que l'éditeur de liens serait capable de reconnaître l'écart et de fournir une erreur plus précise. – OttPrime