c++ - 使用 waf 构建系统将程序与 Boost.Asio 链接

标签 c++ python gcc boost waf

我正在尝试构建 simplest Boost.Asio tutorial example "timer1" (在 timer.cpp 中)在 Debian squeeze、python 2.6.6 上使用 waf。

root@ds:/var/timer# ls

timer.cpp wscript

这里的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 build 那个东西?来自 here 的解决方案对我也不起作用。也试过

...
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',
 ...,
)

您 future 脚本的注意事项:

  • 避免使用 CFLAGS、CXXFLAGS、LINKFLAGS,因为它们不可移植。
  • 不要出发='.'如果可能的话
  • 使用 bld(...) 对比旧语法

关于c++ - 使用 waf 构建系统将程序与 Boost.Asio 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10574121/

相关文章:

c++ - 插入 map 时抛出异常

python - 更改 Python 列表列表中的所有值?

python - 从另一个 .py 文件访问 Python 字典不会更新 Kivy 标签

python - 根据条件将 Pandas DataFrame 中的一行替换为 'NaN'

c++ - C++ 字符串文字的类型

c++ - lua_newthread 正在停止

c++ - C和C++中的全局变量有什么区别?

gcc - 谁能解释一下 gcc 交叉编译器的命名约定?

gcc - 如何删除特定的 ELF 部分,而不删除其他符号?

c++ - 为什么标准草案之间声明主要内容的措辞会发生变化?