【问题标题】:Linking program with Boost.Asio using waf build system使用 waf 构建系统将程序与 Boost.Asio 链接
【发布时间】:2012-05-13 18:22:10
【问题描述】:

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

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库。

但是,如果我通过 gcc 构建示例而不使用 waf,则一切正常。

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 使用的命令行(标记为&lt;*&gt;)与标记为&lt;**&gt; 的命令行相同。但结果完全不同。为什么?我怎么能强迫 waf 建造那个东西? here 的解决方案对我也不起作用。也试过了

...
opt.tool_options('boost')
...
conf.load('compiler_cxx boost')
conf.check_boost()
...
tgen.uselib = 'BOOST'
...

但没有任何影响

还有一个问题。 gcc --verbose 的输出比 waf --verbose 的输出要广泛得多。在我看来,verbose 选项必须强制 waf 显示所有此类信息。为什么那不是真的? waf 选项 -vvv 也不显示此信息。

【问题讨论】:

    标签: c++ python gcc boost waf


    【解决方案1】:

    如果你使用 boost 工具,你应该检查 playground/boost 中的 waf boost 示例,你会看到 check_boost 接受参数。它会解决你的问题。

    或者,如果您不使用该工具,并且使用在可访问文件夹中设置库的真实操作系统,您可以这样做:

    conf.env.LIB_BOOST = ['boost_system']
    
    ...
    
    bld(
     ...,
     use='BOOST',
     ...,
    )
    

    注意你未来的脚本:

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

    【讨论】:

    • 谢谢。但是我如何指定像 conf.env.CXXFLAGS = ['-g3', '-O0', '-std=c++0x', '-fPIC', '-Wall', '-gdwarf-2' , '-rdynamic' ] 没有 CXXFLAGS ?
    • 在正常情况下,您不需要在 wscript 中对它们进行硬编码,而是使用 CXXFLAGS="..." waf configure ;但当然也有例外;)
    • 从您的示例中,-std 是唯一真正需要 来编译源代码的,所以我会将它放在 wscript 中。问题是它只适用于 gcc,所以“if”将有助于避免与其他编译器的损坏。我认为 waf 应该抽象这个来提供一个干净的接口,但是现在还没有完成。
    【解决方案2】:

    原因是与 Debian 捆绑在一起的旧 Boost 1.42 二进制文件位于 /usr/lib 中。当我发现我试图使 /usr/local/lib 更优先时(由 b2 构建的最新 Boost 二进制文件驻留在那里)。但我无法让 waf 做到这一点,而只是完全卸载了 Boost 1.42 二进制文件,之后一切正常

    【讨论】:

      猜你喜欢
      • 2015-12-03
      • 2013-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-30
      • 1970-01-01
      • 2016-07-01
      相关资源
      最近更新 更多