c++ - boost asio 的链接器问题

标签 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) 

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

最佳答案

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

error LNK2005: "void * __cdecl operator new(unsigned int)" (??2@YAPAXI@Z) already defined in LIBCMTD.lib(new.obj)   

文件名的最后 3 个字符 LIBCMTD (MTD) 代表多线程库。如果您正在构建使用此代码的其他组件以及不同类型的库,例如 MT(多线程 - 无调试)或 MDd(dll 的多线程调试),那么您将收到此错误。如果您为 Boost 链接了错误的库集,您也可能会遇到此错误。事实上,从它试图使用的库上面的错误来看是:

'libboost_system-vc100-mt-sgd-1_47.lib'

我认为这是发行版。您需要使用您在自己的代码中使用的相同类型的库进行构建。如果您正在使用 MTD,那么也可以使用 Boost 库的 MTD 版本进行构建。

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

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

关于c++ - boost asio 的链接器问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15540926/

相关文章:

c++ - 如何检测 c/c++ 程序中可能/潜在的堆栈溢出问题?

c++ - 对于具有线程模型两者的对象,COM 编码是否(永远)是必需的?

c++ - 我不明白 ptr_fun

visual-studio-2010 - Visual Studio 2010 数据库构建如果存在则丢弃

c++ - 如何检查二进制文件中是否存在字符串?

c# - 输入字符串的格式不正确

visual-studio-2010 - 将 Visual Studio 2010 Professional 升级到 Premium,安装结束?

c++ - boost线程在中断时不打印退出消息

c++ - 如何 boost Boost ASIO、UDP 客户端应用程序的吞吐量

c++ - 使用边缘容器 boost astar_search