繁体   English   中英

Boost Asio的链接器问题

[英]Linker issue with boost asio

我正在尝试在VS2010-64位上为Boost Asio运行以下代码示例。 摘自链接

#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'

为了解决这些问题,我从链接下载了这些文件

所以我开始出现以下错误:

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) 

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

您可能不需要重新安装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,则还应使用Boost库的MTD版本进行构建。

要查看您的项目正在使用哪些库,请在“解决方案资源管理器”窗口中右键单击该项目,然后选择属性。 也可以从项目菜单中选择属性,但是在执行此操作之前,请确保该项目中有一个文件,因为当前文件已在编辑窗口中打开。 在“运行时库”下,您将看到正在使用的库的类型。 如果项目类型是dll,则此值应确实设置为MDd。 要查看项目的类型,请单击属性下的链接器(或库管理器)选项,如果输出文件为dll,则项目类型为dll。 如果显示库或exe,则项目分别是库或exe。 给定类型的所有项目都应以相同的方式构建。 例如,您不应尝试混用发行版和调试版。 如果您要构建的是exe,请使用用于构建项目库类型的任何库。 要设置库,请在属性下选择配置属性/ C / C ++ /代码生成/运行时库,然后从下拉框中选择一种类型。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM