使用waf构建系统将程序与Boost.Asio链接
Linking program with Boost.Asio using waf build system
我正在尝试构建最简单的 Boost.Asio 教程示例"timer1"(它在 timer.cpp 中(在 Debian squeeze 上使用 waf,python 2.6.6。
root@ds:/var/timer# ls
计时器.cpp 脚本
这里的 wscript 是 WAF 的配置:
#! /usr/bin/env python
top = '.'
out = '.'
def options(opt):
opt.load('compiler_cxx')
def configure(conf):
conf.load('compiler_cxx')
conf.env['LINKFLAGS'] = '--verbose -L/usr/local/lib -lboost_system'
def build(bld):
tgen = bld.new_task_gen()
tgen.features = 'cxx cxxprogram'
tgen.source = 'timer.cpp'
tgen.target = 'timer'
tgen.includes = '.'
tgen.update_outputs = True
waf configure
是成功的。
但是waf --verbose build
以错误结束(我在下面插入<*>
以标记一行(
Waf: Entering directory `/var/timer'
[1/2] cxx: timer.cpp -> timer.cpp.1.o
[2/2] cxxprogram: timer.cpp.1.o -> timer
timer.cpp.1.o: In function `__static_initialization_and_destruction_0(int, int)':
timer.cpp:(.text+0x103): undefined reference to `boost::system::generic_category()'
timer.cpp:(.text+0x10f): undefined reference to `boost::system::generic_category()'
...
Build failed
-> task in 'timer' failed (exit status 1):
{task 38446736: cxxprogram timer.cpp.1.o -> timer}
<*>
['/usr/bin/g++', '--verbose -L/usr/local/lib -lboost_system', 'timer.cpp.1.o', '-o', '/var/timer/timer', '-Wl,-Bstatic', '-Wl,-Bdynamic']
似乎 waf 调用的 gcc 在链接期间没有找到boost_system库。
但是如果我在没有 waf 的情况下通过 gcc 构建示例,一切正常。
root@ds:/var/timer# /usr/bin/g++ --verbose -I/var/flake/lib/boost timer.cpp -c -o timer.cpp.1.o
...
<**>
root@ds:/var/timer# /usr/bin/g++ --verbose -L/usr/local/lib -lboost_system timer.cpp.1.o -o timer -Wl,-Bstatic -Wl,-Bdynamic
...
root@ds:/var/timer# ls
timer.cpp timer.cpp.1.o timer wscript
如您所见,waf使用的命令行(用<*>
标记(与用<**>
标记的命令行相同。但结果却完全不同。为什么?我怎么能强迫 waf 建造那个东西呢?这里的解决方案对我也不起作用。也尝试过
...
opt.tool_options('boost')
...
conf.load('compiler_cxx boost')
conf.check_boost()
...
tgen.uselib = 'BOOST'
...
但没有任何效果
还有一个问题。gcc --verbose
的输出比waf --verbose
的输出要广泛得多。 在我看来,verbose
选项必须强制 waf 显示所有这些信息。为什么不是这样?WAF 选项 -VVV 也不会显示此信息。
如果使用 boost 工具,您应该在 Playground/boost 中查看 waf boost 示例,您会发现 check_boost 需要参数。它将解决您的问题。
或者,如果您不使用该工具,而是使用在可访问文件夹中设置库的真实操作系统,您可以只执行以下操作:
conf.env.LIB_BOOST = ['boost_system']
...
bld(
...,
use='BOOST',
...,
)
有关未来脚本的注意事项:
- 避免使用CFLAGS,CXXFLAGS,LINKFLAGS,因为它不便携。
- 如果可能的话,不要设置='.">
- 使用 bld(...( 与旧语法
原因是与 Debian 捆绑在一起的旧版 Boost 1.42 二进制文件位于/usr/lib 中。当我发现我试图使/usr/local/lib 更具优先级时(b2 构建的最新 Boost 二进制文件驻留在那里(。但是我无法让 waf 做到这一点,而不仅仅是完全卸载 Boost 1.42 二进制文件,之后一切都正常
- 理解boost::asio-async_read在无需读取内容时的行为
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- boost::asio::steady_timer()与sleep()我应该使用哪一个
- boost::asio如何生成多个协同程序,然后加入它们
- 从 Boost ASIO 获取 epoll 描述符 io_service对象
- 如何在 Boost.Asio 中使用 Zero-copy sendmsg/receive
- 如何使用 Boost Asio 在 Android 上获取我的本地 udp IP 地址?
- 执行时使用 boost::asio::d eadline_timer 时出错
- Boost.Asio/OpenSSL HTTPS GET certificate trouble
- boost::asio data owning `ConstBufferSequence`
- 如何替换此示例代码片段中已弃用的handler_type_t或 boost::asio::handler_type?
- 如何将boost::asio::d eadline_timer 与Qt一起使用?
- 将更高的优先级设置为 boost::asio 线程处理进程
- Async_read_until限制读取的字节大小(Boost::asio)
- 程序崩溃使用boost::asio
- boost::asio 无法捕获 SIGINT
- TCP 服务器的异步读取使用 boost::asio 打印客户端套接字发送的数据
- 如何在 boost::asio 中将打包的结构作为消息传递?(无序列化)
- 如何使用C++和Boost Asio从HTTP发布请求中获取键值
- std::boost::asio::p ost / dispatch 使用哪个io_context?