2012-05-13 6 views
1

私はDebian squeeze、python 2.6.6でwafを使ってsimplest Boost.Asio tutorial example "timer1"(これはtimer.cppにあります)をビルドしようとしています。 DS @wafビルドシステムを使ってBoost.Asioとプログラムをリンクする

ルート:の/ var /タイマー#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ライブラリを見つけることができませんでしたようです。

私はwaccなしでgccでビルドするとすべてうまく動作します。あなたは(<*>でマーク)WAFで使用されるコマンドラインを見ることができるように

[email protected]:/var/timer# /usr/bin/g++ --verbose -I/var/flake/lib/boost timer.cpp -c -o timer.cpp.1.o 
... 
<**> 
[email protected]:/var/timer# /usr/bin/g++ --verbose -L/usr/local/lib -lboost_system timer.cpp.1.o -o timer -Wl,-Bstatic -Wl,-Bdynamic 
... 
[email protected]:/var/timer# ls 
timer.cpp timer.cpp.1.o timer wscript 

<**>でマークされたコマンドラインと同一です。しかし、結果はまったく異なっています。どうして?そして、どうすればそれを構築することができますか? hereからの解決策も私のためには機能しません。また

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

を試みたが、何の効果

そして、別の質問なし。 gcc --verboseの出力は、waf --verboseの出力よりはるかに広範囲です。 のオプションは、すべての情報を表示するにはwafを強制しなければならないようでした。なぜそれは本当ではないのですか? wafオプション-vvvはこの情報も表示しません。

答えて

1

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

ツールを使用していない場合は、ライブラリがアクセス可能なフォルダに設定されている実際のOSを使用して、あなただけ行うことができます:あなたの将来のスクリプト用

conf.env.LIB_BOOST = ['boost_system'] 

... 

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

注:

  • CFLAGS、CXXFLAGS、LINKFLAGSの使用は避けてください。携帯ではありません。
  • 設定しない= '。'古い構文対使用BLD(...)
  • 可能であれば
+0

ありがとうございました。しかし、conf.env.CXXFLAGS = ['-g3'、 '-O0'、 '-std = C++ 0x'、 '-fPIC'、 '-Wall'、 '-gdwarf-2'などのフラグを指定するにはどうすればよいですか? 、 '-rdynamic'] CXXFLAGSなしで? – boqapt

+0

通常の場合、wscriptでハードコードする必要はなく、CXXFLAGS = "..." waf configureを使用します。しかし、もちろん例外があります;) –

+0

あなたの例では、ソースをコンパイルするために実際に*必須*のものは-stdだけなので、wscriptに入れます。これはgccでしか動作しないので、 'if'は他のコンパイラでの破損を避けるのに役立ちます。私はwafがきれいなインターフェースを提供するためにこれを抽象化しなければならないと思うが、今は完了していない。 –

0

Debianにバンドルされている古いBoost 1.42バイナリが/ usr/libにあったからです。私は、/ usr/local/libをもっと優先させようとしていることを知りました(b2によって構築された最新のBoostバイナリがそこにあります)。しかし、私はそれをすることができませんでした。ブースト1.42バイナリを完全にアンインストールした後、すべてが正常に機能しました。

関連する問題