私は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はこの情報も表示しません。
ありがとうございました。しかし、conf.env.CXXFLAGS = ['-g3'、 '-O0'、 '-std = C++ 0x'、 '-fPIC'、 '-Wall'、 '-gdwarf-2'などのフラグを指定するにはどうすればよいですか? 、 '-rdynamic'] CXXFLAGSなしで? – boqapt
通常の場合、wscriptでハードコードする必要はなく、CXXFLAGS = "..." waf configureを使用します。しかし、もちろん例外があります;) –
あなたの例では、ソースをコンパイルするために実際に*必須*のものは-stdだけなので、wscriptに入れます。これはgccでしか動作しないので、 'if'は他のコンパイラでの破損を避けるのに役立ちます。私はwafがきれいなインターフェースを提供するためにこれを抽象化しなければならないと思うが、今は完了していない。 –