链接器问题与提升asio

时间:2013-03-21 06:33:37

标签: c++ visual-studio-2010 boost boost-asio

我正在尝试在VS2010 - 64位上为Boost Asio运行以下代码示例。取自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)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)   
Error   10  error LNK2005: "void * __cdecl operator new[](unsigned int)" (??_U@YAPAXI@Z) already defined in libcpmtd.lib(newaop.obj)    
Error   9   error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMTD.lib(dbgdel.obj) 
Error   11  error LNK2005: "void __cdecl operator delete[](void *)" (??_V@YAXPAX@Z) already defined in LIBCMTD.lib(delete2.obj) 

对可能出错的任何建议。我是否需要在其他依赖项中设置一些输入?

1 个答案:

答案 0 :(得分:0)

您可能不需要重新安装Visual Studio。我认为你看到的错误与一种版本控制问题有关。您获得的错误表明某些组件是使用一组库构建的,而其他组件是使用一组不同的库构建的。在错误中:

error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@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。要查看它是什么类型的项目,请单击属性下的链接器(或库管理器)选项,如果输出文件是dll,则项目类型为dll。如果它表示库或exe,那么项目分别是库或exe。您应该以相同的方式构建给定类型的所有项目。例如,您不应该尝试混合和匹配发行版和调试版。如果您正在构建一个exe,那么使用用于构建库类型项目的任何库。要设置库,请在属性下选择配置属性/ C / C ++ /代码生成/运行时库,然后从下拉框中选择一种类型。

如果配置对于所有项目都是正确的,那么请尝试从头开始重建。这可以通过右键单击项目并选择clean,然后选择rebuild来完成。

相关问题