2012-05-13 5 views
1

나는 debian squeeze, python 2.6.6에서 waft로 simplest Boost.Asio tutorial example "timer1" (timer.cpp에 있음)을 빌드하려고합니다. DS @waf 빌드 시스템을 사용하여 Boost.Asio와 프로그램 연결하기

루트의 경우 :/var/타이머 # 1! WScript와는 여기에 웹 애플리케이션 방화벽의 설정입니다

timer.cpp

Wscript가 :

#! /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']  

(나는 선을 표시하기 위해 아래 <*> 삽입)이 보인다 연결시 boost_system 라이브러리를 찾을 수 없습니다 웹 애플리케이션 방화벽에 의해 호출 GCC.

waf없이 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 

<**> 의해 표시된 명령 라인과 동일하다. 그러나 결과는 완전히 다릅니다. 왜? 어떻게 그 물건을 만들도록 waf를 강제 할 수 있습니까? here의 솔루션이 저에게 맞지 않습니다. 또한

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

있지만 효과

그리고 또 다른 질문없이

을 시도했다. gcc --verbose의 출력은 waf --verbose의 출력보다 훨씬 더 광범위합니다. 옵션은 그러한 모든 정보를 표시하기 위해 waf를 강제해야한다는 생각이 들었습니다. 왜 그게 사실이 아니야? waf 옵션 -vvv는이 정보도 표시하지 않습니다.

답변

1

부스트 도구를 사용하는 경우 놀이터/부스트에서 waf 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

그 이유는 데비안에 번들 된 구형 부스트 1.42 바이너리가/usr/lib에 있기 때문입니다. 내가 찾은 바에 따르면/usr/local/lib를 더 우선적으로 만들려고 시도했다. (b2에 의해 빌드 된 최신 Boost 바이너리가 거기에있다.) 하지만 그걸하기 위해 waf를 만들 수는 없었고 그냥 부스트 1.42 바이너리를 완전히 제거한 후에 모든 것이 작동했습니다

관련 문제