별도의 네임 스페이스로 부스트를 랩핑하려면 어떻게해야합니까?

StackOverflow https://stackoverflow.com/questions/122782

  •  02-07-2019
  •  | 
  •  

문제

나는 두 가지 버전의 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);
도움이 되었습니까?

해결책

나는 그것을 통해 (잘 스캔)를 읽었다 개발 목록 토론. 쉬운 해결책은 없습니다. 요약 :

  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 매크로.
    • 당신이 노력에 기꺼이 노력했다면 이것은 효과가있을 것입니다.

다른 팁

사용 BCP 부스트 라이브러리를 특정 위치에 설치할 수 있으며 코드의 모든 '네임 스페이스 부스트'를 사용자 정의 별명으로 바꿀 수 있습니다. 별칭이 'boost_1_36_0'이라고 가정하면 모든 '네임 스페이스 부스트'코드 블록은 'boost_1_36_0'으로 시작됩니다. 같은 것

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

, 그러나 법적 구문인지 확실하지 않기 때문에 링크의 문서를 직접 확인하십시오.

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

엉망이 된 이름이 다를 수 있기 때문에 문제가 발생할 수 있습니다. 그리고 네, 나는 당신이 그것을 알고 있었지만, 그것은 모든 곳에서 문제가 될 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top