2013-03-21 34 views
1

我想運行以下代碼示例爲VS2010-64位升壓阿西歐。從Link鏈接器問題與升壓阿西奧

#include <boost/asio.hpp> 
#include <boost/array.hpp> 
#include <iostream> 
#include <string> 

boost::asio::io_service io_service; 
boost::asio::ip::tcp::resolver resolver(io_service); 
boost::asio::ip::tcp::socket sock(io_service); 
boost::array<char, 4096> buffer; 

void read_handler(const boost::system::error_code &ec, std::size_t bytes_transferred) 
{ 
    if (!ec) 
    { 
     std::cout << std::string(buffer.data(), bytes_transferred) << std::endl; 
     sock.async_read_some(boost::asio::buffer(buffer), read_handler); 
    } 
} 

void connect_handler(const boost::system::error_code &ec) 
{ 
    if (!ec) 
    { 
     boost::asio::write(sock, boost::asio::buffer("GET/HTTP 1.1\r\nHost: highscore.de\r\n\r\n")); 
     sock.async_read_some(boost::asio::buffer(buffer), read_handler); 
    } 
} 

void resolve_handler(const boost::system::error_code &ec, boost::asio::ip::tcp::resolver::iterator it) 
{ 
    if (!ec) 
    { 
     sock.async_connect(*it, connect_handler); 
    } 
} 

int main() 
{ 
    boost::asio::ip::tcp::resolver::query query("www.highscore.de", "80"); 
    resolver.async_resolve(query, resolve_handler); 
    io_service.run(); 
} 

採取然後我開始收到以下錯誤

cannot open file 'libboost_system-vc100-mt-sgd-1_47.lib' 
cannot open file 'libboost_date_time-vc100-mt-sgd-1_47.lib' 
cannot open file 'libboost_regex-vc100-mt-sgd-1_47.lib' 

爲了解決這些問題,我從Link

於是我開始收到以下錯誤下載這些文件:

Error 12 error LNK1169: one or more multiply defined symbols found 
Error 8 error LNK2005: "void * __cdecl operator new(unsigned int)" ([email protected]@Z) already defined in LIBCMTD.lib(new.obj) 
Error 10 error LNK2005: "void * __cdecl operator new[](unsigned int)" ([email protected]@Z) already defined in libcpmtd.lib(newaop.obj)  
Error 9 error LNK2005: "void __cdecl operator delete(void *)" ([email protected]@Z) already defined in LIBCMTD.lib(dbgdel.obj) 
Error 11 error LNK2005: "void __cdecl operator delete[](void *)" ([email protected]@Z) already defined in LIBCMTD.lib(delete2.obj) 

關於什麼mi的任何建議不會出錯。我是否需要在其他依賴項中設置一些輸入?

+0

您沒有顯示包含的頭文件和傳遞給編譯器的命令行標誌;請將它們添加到您的問題中,這將有所幫助。您得到的鏈接器錯誤是因爲多個對象文件具有相同功能的定義。 – 2013-03-21 06:37:14

+0

我如何獲得VS2010的命令行標誌? – Rajeshwar 2013-03-21 06:38:22

+1

那麼這是一個很好的問題,一些Visual Studio用戶會幫助你。一個簡單的方法來擺脫這個錯誤將是卸載,然後重新安裝boost庫(我不知道,但)。我瞭解到重新安裝應用程序確實可以在Windows上運行。 – 2013-03-21 06:40:43

回答

0

您可能不需要重新安裝Visual Studio。我認爲你所看到的錯誤與一種版本控制問題有關。您收到的錯誤表明某些組件是使用一組庫建立的,而其他組件是使用不同的一組庫建立的。在該錯誤:

error LNK2005: "void * __cdecl operator new(unsigned int)" ([email protected]@Z) already defined in LIBCMTD.lib(new.obj) 

文件名LIBCMTD(MTD)的最後3個字符代表多線程庫。如果您正在構建其他使用不同類型庫(例如MT(多線程 - 無調試)或MDd(dll的多線程調試))的代碼,則會出現此錯誤。如果您使用Boost的一組錯誤鏈接庫,則可能會出現此錯誤。事實上,從它試圖使用庫上面的錯誤是:

「libboost_system-VC100-MT-SGD-1_47.lib」

我相信這是發行版本。您需要使用您在自己的代碼中使用的相同類型的庫進行構建。如果您使用的是MTD,那麼也可以使用MTD版本的Boost庫進行構建。

要查看您的項目正在使用的庫,請右鍵單擊解決方案資源管理器窗口中的項目並選擇屬性。也可以從項目菜單中選擇屬性,但在執行此操作之前,請確保在該項目中有一個文件作爲在編輯窗口中打開的當前文件。在運行時庫下,您將看到您正在使用的庫的類型。如果項目類型是一個dll,那麼這個值應該被設置爲MDd。要查看它是什麼類型的項目,請單擊屬性下的鏈接器(或Librarian)選項,如果輸出文件是dll,則項目類型爲dll。如果它說庫或exe,那麼該項目分別是庫或exe。所有類型的項目都應該以相同的方式構建。例如,您不應該嘗試混合使用版本和調試版本。如果你有一個你正在構建的exe文件,那麼使用任何用來構建庫類型項目的庫。要設置庫,請在屬性下選擇配置屬性/ C/C++ /代碼生成/運行時庫,然後從下拉框中選擇一種類型。

如果配置看起來對所有項目都是正確的,那麼嘗試從頭開始重建。這可以通過右鍵單擊項目並選擇clean,然後選擇rebuild來完成。