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

时间:2012-05-13 18:22:10

标签: c++ python gcc boost waf

我正在尝试使用Debian squeeze,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']    

看来gaf调用的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使用的命令行(由<*>标记)与<**>标记的命令行相同。但结果完全不同。为什么?我怎么能强迫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也不显示此信息。

2 个答案:

答案 0 :(得分:1)

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

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

conf.env.LIB_BOOST = ['boost_system']

...

bld(
 ...,
 use='BOOST',
 ...,
)

请注意以后的脚本:

  • 避免使用CFLAGS,CXXFLAGS,LINKFLAGS,因为它不便携。
  • 不要列出='。'如果可能的话
  • 使用bld(...)与旧语法

答案 1 :(得分:0)

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