1

最も単純なBoost.Asioチュートリアルの例「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にそれを構築させることができますか? ここからの解決策も私にはうまくいきません。また試した

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

しかし何の効果もなく

そして別の質問です。の出力は、 のgcc --verbose出力よりもはるかに広範囲ですwaf --verboseverboseオプションはwafにそのようなすべての情報を表示させる必要があるように思えました。なぜそうではないのですか?waf オプション -vvv もこの情報を表示しません。

4

2 に答える 2

1

ブースト ツールを使用する場合は、playground/boost の waf ブーストの例を確認する必要があります。check_boost が引数を取ることがわかります。それはあなたの問題を解決します。

または、ツールを使用せず、ライブラリがアクセス可能なフォルダーにセットアップされている実際の OS を使用している場合は、次のようにするだけです。

conf.env.LIB_BOOST = ['boost_system']

...

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

今後のスクリプトに関する注意:

  • 移植性がないため、CFLAGS、CXXFLAGS、LINKFLAGS の使用は避けてください。
  • ='.' を設定しないでください。もし可能なら
  • 古い構文に対して bld(...) を使用する
于 2012-06-17T16:23:06.667 に答える
0

その理由は、Debianにバンドルされている古いBoost1.42バイナリが/usr/libにあったためです。/ usr / local / libをより優先的にしようとしたことがわかったとき(b2によって構築された最新のBoostバイナリがそこにあります)。しかし、私はそれを行うためにwafを作成することができず、Boost 1.42バイナリを完全にアンインストールしただけで、その後はすべてが機能しました。

于 2012-05-14T08:06:39.640 に答える