2008-09-23 9 views
10

두 버전의 BOOST를 동시에 프로젝트로 컴파일하려고합니다. 이상적으로는 다음 줄을 따라 사용할 수 있어야합니다.어떻게 BOOST를 별도의 네임 스페이스로 감쌀 수 있습니까?

boost_1_36_0::boost::shared_ptr<SomeClass> someClass = new SomeClass(); 
boost_1_35_0::boost::regex expression("[0-9]", boost_1_35_0::boost::regex_constants::basic); 
+0

왜 이렇게하고 싶은지 궁금합니다. – Ferruccio

+0

일부 비 호환성을 해결하는 동안 새로운 라이브러리 버전으로 전환하기위한 것이 었습니다. 영원한 것은 아무것도 없다. – Eclipse

+0

@Eclipse : 인터페이스에 Boost 유형을 표시하지 않으려면 ELF 가시성 속성을 사용하여 공용 인터페이스가 아닌 모든 것을 숨길 수 있습니다. – wilx

답변

10

development list discussion을 읽었습니다 (잘 스캔 됨). 쉬운 해결책이 없습니다. 정리해 :

  1. 포장 헤더 파일을

    namespace boost_1_36_0 { 
        #include <boost_1_36_0/boost/regex.hpp> 
    } 
    namespace boost_1_35_0 { 
        #include <boost_1_35_0/boost/shared_ptr.hpp> 
    } 
    
    • 이 같은 번역 단위에 포함되는 두 버전을 허용하지 않는 소스 파일을 수정이 필요 네임 스페이스 선언에서, 왜냐하면 매크로는 네임 스페이스를 존중하지 않기 때문입니다.
  2. 포함 헤더 전에 향상을 정의

    #define boost boost_1_36_0 
        #include <boost_1_36_0/boost/regex.hpp> 
    #undef boost 
    #define boost boost_1_35_0 
        #include <boost_1_35_0/boost/shared_ptr.hpp> 
    #undef boost 
    
    • 소스 파일은 단순히 하나의 번역 단위에서 매크로 충돌을 해결하지 않습니다 아직 -Dboost=boost_1_36_0
    • 컴파일 할 수 있습니다.
    • 이런 종류의 일이 발생하기 때문에 일부 내부 헤더 파일 포함이 엉망이 될 수 있습니다.

      #if defined(SOME_CONDITION) 
      # define HEADER <boost/some/header.hpp> 
      #else 
      # define HEADER <boost/some/other/header.hpp> 
      #endif 
      

      그러나 이러한 경우를 해결하기는 쉽지 않을 수 있습니다.

  3. 전체 부스트 라이브러리 namespace boost {..}namespace boost_1_36_0 {...}으로 다음 네임 스페이스 별칭을 제공하는 대체하기 위해 수정. 모든 BOOST_XYZ 매크로와 해당 매크로를 BOOST_1_36_0_XYZ 매크로로 바꿉니다.
    • 이 작업을 수행하는 데 도움이 될 가능성이 높습니다.
+0

헤더를 수정하려면 's/BOOST_/BOOST_1_36_0_/g'와 같은 매크로 충돌을 피할 수 있습니다. 아마도. –

+0

귀하의 제안을 알려드립니다. – Eclipse

0

맹 글링 된 이름이 다를 수 있으므로 문제가되는 링크가 있습니다. 그리고 네, 당신이 그것을 알았 음을 알지만 그것이 모든 문제가 될 것처럼 보입니다.

+0

그건 요점이 될 것입니다. boostv1 디렉토리에있는 모든 정규식 소스 파일을 네임 스페이스 지시어로 묶었습니다. – Eclipse

+0

Daniel의 요점을 참조하십시오. 매크로가 킬러가됩니다 –

1

@ Josh : 나는 떨리는 것에 동의하지만, 여전히 이것이 더 나은 행동의 과정이라고 생각합니다. 그렇지 않으면 연결 문제가 확실합니다. 나는 정의 충돌을 피하기 위해 objcopy을 사용하여 컴파일 된 라이브러리를 해킹해야만했던 상황을 이미 경험했다. 플랫폼 상호 운용성의 이유로 악몽이었습니다. 그 이유는 동일한 컴파일러 (다른 경우에는 GCC)의 다른 버전에서도 이름 맹 글링이 매우 다르게 작동하기 때문입니다.

4

특정 위치로 부스트 라이브러리를 설치할 수 있습니다 bcp를 사용하고 사용자 정의 별칭에 자신의 코드에있는 모든 '네임 스페이스 부스트'를 대체 할 수 있습니다. 별칭이 'boost_1_36_0'이라고 가정하면 모든 '네임 스페이스 부스트'코드 블록은 'boost_1_36_0'으로 시작합니다.

bcp --namespace=boost_1_36_0 --namespace-alias shared_ptr regex /path/to/install 

과 같은 문구가 있지만 법률 문법인지 확실하지 않으므로 직접 링크에서 문서를 확인하십시오.