별도의 네임 스페이스로 부스트를 랩핑하려면 어떻게해야합니까?
-
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);
해결책
나는 그것을 통해 (잘 스캔)를 읽었다 개발 목록 토론. 쉬운 해결책은 없습니다. 요약 :
네임 스페이스 선언에서 헤더 파일을 래핑합니다
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> }
- 소스 파일 수정이 필요합니다
- 매크로가 네임 스페이스를 존중하지 않기 때문에 두 버전이 동일한 번역 장치에 포함되지 않습니다.
헤더를 포함하기 전에 부스트를 정의합니다
#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
그러나 그러한 경우를 해결하기에 충분히 쉬울 수 있습니다.
- 소스 파일을 단순히 컴파일 할 수 있습니다
- 교체 할 부스트 라이브러리 전체를 수정합니다
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)에서도 매우 다르게 작동하기 때문에 플랫폼 상호 운용성 이유에 대한 악몽이었습니다.
엉망이 된 이름이 다를 수 있기 때문에 문제가 발생할 수 있습니다. 그리고 네, 나는 당신이 그것을 알고 있었지만, 그것은 모든 곳에서 문제가 될 것 같습니다.