2011-07-16 32 views
4

我在嘗試在我的新應用程序中使用ZeroMQ時遇到問題。請注意:我沒有問題下載和建立ZeroMQ本身。我下載了ZeroMQ ZIP文件,在Visual Studio/C++ 2008中打開了項目/解決方案文件,並構建了ZeroMQ庫。 ZeroMQ安裝文件夾的/ lib目錄包含.lib,.dll和其他文件,據我所知,這一切都很好。ZeroMQ和Visual C++ 2008的鏈接器問題

我的問題是,我正嘗試在ZeroMQ用戶指南中構建一個包含HelloWorld服務器示例的簡單項目。我創建了以下叫做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 installatiion包括目錄到VC++ 2008包括路徑(屬性 - >配置屬性> C/C++ - >通用>附加包含目錄)和I還添加了ZeroMQ lib目錄到項目: (屬性 - >配置屬性 - > C/C++ - >代碼生成 - >運行時庫,選中Multithreaded Debug DLL/MDd)。

我試圖建立這個項目。一切編譯罰款布提得到一堆無法解析的外部像這樣的鏈接時:

1>鏈接... 1> helloserver.obj:錯誤LNK2019:解析外部符號_ 小鬼 _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 refe renced在函數_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 _zm q_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個未解析的外部程序

我試着回到代碼生成 - >運行時庫設置並嘗試更改庫切換到?MD或/ MT,但沒有任何工作,我仍然得到這些鏈接器錯誤。

請注意,當我創建helloworld.c時,我使用了一個空的Windows控制檯應用程序項目,並且我所做的唯一更改是添加如上所述的ZeroMQ include和lib目錄。我沒有更改任何其他默認項目設置。我猜我錯過了某個地方的項目設置。

我該如何解決這個問題?

+0

另請注意,我通過雙擊自己的解決方案文件構建了ZeroMQ,因此我將它構建爲它自己的獨立解決方案。我的HelloWorld項目在它自己的HelloWorld解決方案中。我是否需要將ZeroMQ庫與HelloWorld一起放入相同的解決方案中才能正確構建它?如果是這樣,我該怎麼做? – Marc

+0

哦,是的,我已經將ZeroMQ lib路徑添加到我的HellowOrld項目(項目 - >參考 - >添加路徑)。我可以添加路徑,但添加新參考窗口彈出並沒有任何內容。 – Marc

+0

好的,我通過將ZeroMQ項目libzmq添加到我的新HelloWorld解決方案中來實現這一目標。我終於可以看到libzmq顯示爲可添加到「添加新參考」窗口中的參考。它現在鏈接正常。如果在VC++中創建解決方案,是否真的如此?您必須在此解決方案中包含外部庫項目以及您自己的用戶項目嗎?這對我來說似乎有點愚蠢。 – Marc

回答

2

你沒有提到你也添加了具體的lib到你的項目。請注意,僅僅告訴VS只有lib路徑是不夠的,但您還必須將lib本身添加到您的項目中。我現在沒有Visual Studio,但是您會在項目的鏈接器設置中找到此選項。在那裏你可以提到你想鏈接的所有庫。

4

添加ZMQ庫路徑(其中ZMQ庫安裝路徑\ zeromq-2.1.10 \ LIB) 到您的項目:

項目 - >屬性 - >連接器 - >常規 - >附加庫目錄

同時添加libzmq.lib到

項目 - >屬性 - >連接器 - >輸入 - >附加依賴

有趣的是,你需要有libzmq.dll的副本在您的項目一樣,當你運行你的項目時,調試器會抱怨「無法找到libzmq.dll」。仍在尋找解決方法。

注意:這是我用來在Visual Studio 2010中運行我的zmq代碼。也應該適用於VS 2008。

6

當我得到類似的錯誤,這是因爲我試圖將64位庫鏈接到一個32位項目。我下載了錯誤的版本。當我得到正確的,即x86而不是x64,它工作。

+0

這也是我的解決方案。我認爲鏈接器能夠識別差異並提供更準確的錯誤。 – OttPrime