boost:asio编译

转载自:http://www.cnblogs.com/lidabo/p/3782293.html

环境: VS2012,

          boost_1_61_0,解压缩后放在,D:/boost_1_61_0。

1,编译。

   boost库大部分源文件是只有头文件,所以有很多库不用编译就可以使用。asio本身不需要编译,但是它依赖于boost.system和boost.datetime库,用来提供系统错误和时间支持,其他可选库有regex,thread和serialization。

   怎么去编译呢?打开vs2012 Visual Studio Tools下面的VS2012 x64 兼容工具命令提示,运行bootstrap.bat gcc编译出bjam.exe。 因为asio依赖于其它的一些库,所以编译参数还有点复杂。然后在cmd下输入:

D:/boost_1_61_0>bjam --with-system --with-thread --with-date_time --with-regex --with-serialization stage   

   编译完成后就可以在boost_1_61_0/stage里面找到编译好的库文件。

   有时候你的系统上面可能装了几个版本的VS,那么怎么指定版本呢?

D:/boost_1_38_0>bjam --without-python --toolset=msvc-11.0 --with-thread --with-date_time --with-regex --with-serialization stage

--without-python 表示不使用 python
--toolset : 所使用compiler,Visual Studio 2012為msvc-11.0
--prefix:指定編譯後library的安裝目錄

 

接下来就是导入include目录boost根目录到vs中,导入编译后的lib文件目录stage/lib到lib路径中去。

vs2012:右击project->properties->VC++ Directories. 将D:/boost_1_61_0加入到include directories中去,将D:/boost_1_61_0/stage/lib加入到Library Directories路径中去。

 库文件名称分析(libboost_filesystem-vc80-mt-sgdp-1_42.lib):

前缀:统一为lib,但在windows下只有静态有lib前缀;

库名称:以"boost_"开头的库名称,在这里是boost_filesystem;

编译器标识:编译该库文件的编译器名称和版本,在这里是-vc80;

多线程标识:支持多线程使用-mt,没有标识不支持多线程

ABI标识:这个标识了boost库的几个编译链接选项:

s:静态库标识

gd:debug版标识

P:使用STLport而不是编译器自带STL实现

版本号:Boost库的版本号,小数点用下划线代替,这里是1_42;

扩展名:windows上是.lib,linux上是.so


2, 尝试第一个程序。

把asio下面的文档中的第一个例子抄下来.

//  
// timer.cpp  
// ~~~~~~~~~  
//  
// Copyright (c) 2003-2008 Christopher M. Kohlhoff (chris at kohlhoff dot com)  
//  
// Distributed under the Boost Software License, Version 1.0. (See accompanying  
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)  
//  
  
#include <iostream>  
#include <boost/asio.hpp>  
#include <boost/date_time/posix_time/posix_time.hpp>  
  
int main()  
{  
  boost::asio::io_service io;  
  
  boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));  
  t.wait();  
  
  std::cout << "Hello, world!/n";  
  
  return 0;  
}  

编译,成功!


如果编译报错请看下面:

1>LINK : fatal error LNK1104: cannot open file 'libboost_system-vc100-mt-gd-1_38.lib'

仔细一查,确实没有找到这个文件,怎么办?

可能是没有编译debug文件,暂时也不知道编译的时候该添加哪个参数让它编译debug文件。于是将编译选项output改为release,再编译。

编译出错。

LINK : fatal error LNK1104: cannot open file 'libboost_regex-vc100-mt-1_38.lib'

 

 网上google了一把,看到下面文字

注意:

使用MSVC或Borland C++,你可能需要在“工程设置”中分别添加 -DBOOST_DATE_TIME_NO_LIB 和-DBOOST_REGEX_NO_LIB 声明,分别禁止Boost.Date_Time和Boost.Regex的自动链接,当然你也可以这样做:build这两个库,然后链接。


试试。加 -DBOOST_DATE_TIME_NO_LIB 和-DBOOST_REGEX_NO_LIB 声明到工程选项的c/C++/commandline后面,编译,成功!高兴!

运行,ok!

bjam参数
--build-dir=<builddir> 编译的临时文件会放在builddir里(这样比较好管理,编译完就可以把它删除了)
--stagedir=<stagedir> 存放编译后库文件的路径,默认是stage
--build-type=complete 编译所有版本,不然只会编译一小部分版本(确切地说是相当于:variant=release, threading=multi;link=shared|static;runtime-link=shared)
variant=debug|release 决定编译什么版本(Debug or Release?)
link=static|shared 决定使用静态库还是动态库。
threading=single|multi 决定使用单线程还是多线程库。
runtime-link=static|shared 决定是静态还是动态链接C/C++标准库。
--with-<library> 只编译指定的库,如输入--with-regex就只编译regex库了。
--show-libraries 显示需要编译的库名称

`boost::asio::ip` 是 Boost.Asio 中的一个模块,它提供了高级接口用于处理 Internet 协议(IP)和 TCP/IP 相关的功能,如网络套接字、地址解析等。如果你在使用这个时遇到编译错误或警告,报红通常意味着代码存在语法错误、依赖不正确、或者你尝试使用的特定功能可能在当前环境下不被支持。 报红的具体原因可能包括: 1. **缺少头文件**:确保你已经包含了 `boost/asio/ip.hpp` 或者相应的 IP 特性头文件。 2. **未正确初始化**:可能在创建异步操作前没有正确设置 ASIO 的运行环境,例如未调用 `io_service.run()` 或者 `io_service.run_one()`。 3. **错误的类型或函数使用**:检查你的函数参数类型是否匹配的预期,例如使用了错误的 IP 地址类型。 4. **版本兼容性问题**:如果使用的 Boost 版本与你所依赖的功能不兼容,可能会引发错误。 5. **API 已更新**:Boost可能会有更新,旧的 API 可能已经被弃用或者改变,你需要查阅最新的文档来适应新的接口。 为了解决这个问题,请按以下步骤进行: 1. **查看编译错误信息**:错误消息会告诉你具体的出错位置和原因。 2. **检查版本**:确保你使用的 Boost 版本支持 ASIO 的 `ip` 功能。 3. **查阅文档**:访问 Boost.Asio 或 `boost::asio::ip` 的官方文档,寻找解决方案或替代方法。 4. **更新代码**:修复语法错误,调整函数调用或引入所需的依赖。 如果你能提供具体的报错信息,我可以帮助你更准确地定位问题。相关问题: 1. 你遇到的是编译错误还是运行时错误? 2. 错误信息中提到了哪些函数或类? 3. 是否使用了特定的 Boost.Asio 版本?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值