2017-02-16 1 views
0

다른 공유 라이브러리 (B)를 사용하는 공유 라이브러리 (A)를 컴파일하려고합니다.공유 라이브러리 (이전 standar)를 C++ 11 공유 라이브러리로 컴파일

g 라이브러리에 -std=c++11 옵션을 추가하지 않고 A 라이브러리를 컴파일해야합니다. 코드 수가 많고 std::make_pair과 같은 일부 항목은 '11 표준과 호환되지 않습니다.

B 라이브러리를 사용하는 경우 첫 번째 파일은 #include "B.h" 파일 중 하나에 넣은 다음 -I/path/inc -L/path/lib -lB으로 컴파일하십시오.

라이브러리 B는 namespace B 내부 함수 세트로 구성되며 자체 네임 스페이스 (B :: internals)에 일부 클래스 정의가 포함됩니다. 함수와 클래스 사이의 관계는 전역 범위의 정적 포인터이며 __attribute__((constructor))으로 초기화됩니다.

문제는이 클래스 (B : 내부 : ClassB가)를의 포함 체인 다음과 같은 몇 가지 std::mutex 개인 속성을 정의하고 있다는 것입니다 : LIBA -> libB - 가 LIBA를 컴파일 할 때 만든다>std::mutex ->B::internals-std=c++11 표준 컴파일이 실패합니다.

그러나 libA는 B::internals을 사용하지 않으므로 두 라이브러리를 혼합해도 문제가되지 않습니다. 또한 C++ 11 기능이 개인 속성 인 경우 libA에 숨겨진 이유는 무엇입니까? libA에 B::internals을 숨기기위한 패턴이 있습니까?

답변

1

Pimpl이라는 구현 정보를 숨기는 C++ 관용구가 있습니다.

다른 C++ 옵션으로 컴파일 된 라이브러리는 다른 C++ 버전에서 레이아웃이 다르므로 해당 인터페이스에 std 컨테이너를 노출하지 않아야합니다.

+0

그리고 libA와 링크하기위한 헤더와 libB를 컴파일하기위한 헤더라는 두 개의 헤더가 필요합니까? 이 문제를 해결하기 위해 #ifdef와 같은 트릭이 있습니까? 아니면 piplm이 업계에서 사실상 스탠드입니까? – marolafm

+0

@marolafm API (C 스타일 함수, 인터페이스 + 팩토리 함수, Pimpl)를 노출하는 방법은 사용자에게 달려 있지만 구현 세부 정보가 헤더에 없어야합니다. –

관련 문제