我正在尝试在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)
关于可能出问题的任何建议。我是否需要在其他依赖项中设置一些输入?
最佳答案
您可能不需要重新安装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来完成。