clang ++ -stdlib = libc ++와 함께 libstdc ++ 컴파일 된 라이브러리 사용
저는 Mac OS X (10.8.2)에서 C ++로 작업 중이며 최근에 libc ++ stdlib를 사용하는 clang ++ 컴파일러를 통해 사용할 수있는 C ++ 11 기능을 사용할 필요성을 생각해 냈습니다. 그러나 libstdc ++ (MacPorts에서 제공)에 대해 컴파일되고 연결된 레거시 라이브러리도 사용해야합니다.
이렇게하면 예를 들어를 사용하는 레거시 라이브러리의 헤더가 구현 대신 (즉,의 libc ++ 구현 ) std::string
에 대해 해결되어야 했기 때문에 링크 오류가 발생했습니다 .std::__1::basic_string
std::string
std::basic_string
개발중인 두 라이브러리를 혼합하는 방법이 있습니까 (예 : 일부 전 처리기 플래그 사용)?
지금보고있는 것은 ABI 버전 관리를 위해 인라인 네임 스페이스 를 사용하는 것입니다 .
의미 :
libstdc ++ std::string
는 libc ++와 다른 데이터 구조 std::string
입니다. 전자는 참조 횟수 설계이지만 후자는 그렇지 않습니다. API와 호환되지만 ABI와는 호환되지 않습니다. 즉 std::string
, libstdc ++를 사용하여를 생성 한 다음 libc ++에 연결된 다른 코드로 전달하면 수신 코드가 libc ++가 있다고 생각합니다 std::string
. 즉, 수신자는 참조 횟수를 늘리거나 줄여야한다는 단서가 없습니다.
인라인 네임 스페이스가 없으면 결과는 런타임 오류입니다. 당신이 바랄 수있는 최선은 충돌입니다. 인라인 네임 스페이스를 사용하면이 런타임 오류가 링크 시간 오류로 변환됩니다.
프로그래머에게 libstdc ++ std::string
와 libc ++ std::string
는 같은 유형으로 보입니다. 그러나 링커에게는 완전히 다른 유형처럼 보입니다 (단서는 std::__1
네임 스페이스입니다). 그리고 링커의 견해가 정확합니다. 그들은 수 있습니다 완전히 다른 종류.
그래서 예, 당신은 물건을 연결하기 위해 일부 전 처리기 플래그를 조작 할 수 있습니다. 그러나 결과적으로 발생하는 런타임 버그를 디버깅하는 데 시간이 많이 걸립니다.
당신이 원하는 것을 할 수있는 유일한 방법은이 dylibs 사이의 인터페이스를 포함하지 만드는 것입니다 std::
같은 유형 string
. 예를 들어 char
대신 배열을 전달할 수 있습니다. libstdc ++ 링크 코드에서 libc ++ 링크 코드로 또는 그 반대로 메모리 소유권을 전송할 수도 있습니다 (둘 다 동일한 malloc 풀로 삭제됩니다).
참고 URL : https://stackoverflow.com/questions/12542971/using-libstdc-compiled-libraries-with-clang-stdlib-libc
'Development Tip' 카테고리의 다른 글
그렇다면“from __future__ import barry_as_FLUFL”은 정확히 무엇을합니까? (0) | 2020.11.08 |
---|---|
교차 도메인 iframe의 DOM 콘텐츠 가져 오기 (0) | 2020.11.08 |
Lists.newArrayList 대 새 ArrayList (0) | 2020.11.07 |
자동 레이아웃 (제약 조건) 상위보기에서 나란히보기 2 개 중앙 (0) | 2020.11.07 |
정밀도와 소수 자릿수가 지정된 문자열로 float를 변환 하시겠습니까? (0) | 2020.11.07 |