博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Boost.asio入门心得: 编译和链接的注意事项
阅读量:5022 次
发布时间:2019-06-12

本文共 2144 字,大约阅读时间需要 7 分钟。

  最近准备跟乐搞个IM. 网络这个坑终究还是准备想跳了, 于是拿来Boost.asio小试牛刀. 折腾了几天, 也遇到了不少问题.  参考资料: Boost官方文档. 

  Boost中大部分库包含hpp文件即可直接使用, 少部分需要预先编译. asio这个库依赖了几个需要编译的库: system, regex, date_time, serialization, thread. 所以, 要使用asio, 首先要编译这几个库. 如官方文档所说():

  You may build the subset of Boost libraries required to use Boost.Asio and its examples by running the following command from the root of the Boost download package:

bjam --with-system --with-thread --with-date_time --with-regex --with-serialization stage

  具体bjam的编译选项可以参考bjam的相关文档. 或者直接使用bjam --help也可以看到bjam的各种参数的说明. 这里不再赘述. 

  编译好之后, 照着tutorial, 拉下来两份代码, 分别是Daytime.1和Daytime.2

  文档里面对代码几乎每行都有注释了, 而且结构简单也不难理解. 但是在编译的过程中遇到点麻烦.使用gcc(mingw)分别在linux下和windows下进行编译. 

  lwindows下的makefile如下: 

 

all:client.exe server.exe

 

client.exe:client.cpp

g++ client.cpp -o client.exe \
  -I D:\workplace\tools\boost_1_49_0 \
  -L D:\workplace\tools\boost_1_49_0\stage\lib \
  -static -lpthread -lboost_thread-mgw44-mt-1_49 \
  -lboost_system-mgw44-mt-1_49 \
  -lboost_date_time-mgw44-mt-1_49 \
  -lboost_regex-mgw44-mt-1_49 \
  -lwsock32 \
  -lws2_32

server.exe:server.cpp
  g++ server.cpp -o server.exe \
  -I D:\workplace\tools\boost_1_49_0 \
  -L D:\workplace\tools\boost_1_49_0\stage\lib \
  -static -lpthread -lboost_thread-mgw44-mt-1_49 \
  -lboost_system-mgw44-mt-1_49 \
  -lboost_date_time-mgw44-mt-1_49 \
  -lboost_regex-mgw44-mt-1_49 \
  -lwsock32 \
  -lws2_32

 

  除了需要链接boost_thread, boost_system, boost_date_time, boost_regex之外, 还需要链接pthread, wsock32和ws2_32. 在linux下, 就不需要wsock32和ws2_32了. 

  另外关于代码中的一点说明: 

  在代码server.cpp中, 

tcp::acceptor acceptor(io_service, tcp::endpoint(tcp::v4(), 13));

  tutorial中的端口号设置为13. 实际上貌似5000一下的端口号都是系统使用了的. 将这个值设置为一个大于5000的值. 

 

  在代码client.cpp中, 

tcp::resolver::query query(argv[1], "daytime");

  这一行query构造函数的两个参数, 分别代表的主机的ip地址和端口号(或服务名称). 嘛, 看来看去没看出来server那边咋知道自己叫做 "daytime" 的. 于是将第二个参数改成server.cpp中设定的端口号的值. 

  编译成功之后, 首先运行server.exe, 然后运行client.exe, 在命令行参数中输入server的ip地址. 如果是本机为server的话可以直接使用 "localhost" 或者 "127.0.0.1" , 然后会打印出client从server中获取的时间. 

  这个看似简单的过程其实还是不知不觉的折腾了许久. 终于搞定了. 下一步继续研究下asio的各种基本用法, 研究下example里面的内容. 

 

  

 

转载于:https://www.cnblogs.com/HGtz2222/archive/2012/07/30/2614473.html

你可能感兴趣的文章
关于根据Build Platform或者OS 加载x86或者x64 dll的问题
查看>>
程序员高效开发的几个技巧
查看>>
js-权威指南学习笔记19.2
查看>>
hexo 搭建博客
查看>>
关于 UIWebView 几个高级用法
查看>>
maven创建的项目中无法创建src/main/java 解决方案
查看>>
华为软件开发云测评报告二:代码检查
查看>>
集合1
查看>>
js 原生 ajax
查看>>
关键词 virtual
查看>>
建造者模式(屌丝专用)
查看>>
UVALive 4730 Kingdom +段树和支票托收
查看>>
[APIO2010]特别行动队
查看>>
[SCOI2016]幸运数字
查看>>
SpringBoot 集成ehcache
查看>>
初步swift语言学习笔记2(可选类型?和隐式可选类型!)
查看>>
Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
查看>>
在Vs2012 中使用SQL Server 2012 Express LocalDB打开Sqlserver2012数据库
查看>>
在Macos下完美解决Adobe Dreamweaver CC 2018 汉化及操作方法
查看>>
【转】 Newtonsoft.Json高级用法
查看>>