저는 고성능 C++ 클래스를 공유 라이브러리로 컴파일 한 얇은 C 계층으로 래핑 한 다음 Python과 같은 다른 프로그래밍 언어로로드하는 기술을 종종 사용합니다.C++ 바이너리 코드가 네이티브 C 인터페이스를 통해 이식 가능할 수 있습니까? 한계는 무엇입니까?
여기저기서 읽으면서이 기능이 작동하는 유일한 요구 사항은 에만 기본 유형 또는이 유형의 구조체 인 인터페이스를 사용하는 것임을 이해합니다. (따라서, int
및 long
s, float
, double
등 및 임의의 등급의 포인터).
내 질문은 : 다양한 컴파일러간에 전체 ABI compatibility을 가정하면 공유 라이브러리와 완전한 API 호환성을 갖기 위해 충족해야하는 유일한 요구 사항입니까?
왜 C++ 라이브러리를 이식 할 수 없습니까? 여기 내 이해가 있습니다 :
사례 1 : 유형 std::string
을 고려하십시오. 내부적으로는 char*
null로 끝나는 문자열과 크기 정수를 포함합니다. C++ 표준은 이들 중 어느 것이 우선되어야한다고 말하지 않습니다 (맞습니까?). 즉, 함수 인터페이스에 std::string
을 입력하면 서로 다른 두 개의 컴파일러가 순서가 다를 수 있으며 작동하지 않습니다.
사례 2 : 가상 메소드가있는 클래스의 상속 및 vtable을 고려하십시오. C++ 표준에는 vtable 포인터가 있어야하는 위치/순서가 필요하지 않습니다 (오른쪽?). 그것들은 다른 변수보다 먼저 클래스의 시작에있을 수 있고, 다른 모든 멤버 변수 뒤에있을 수도 있습니다. 다시 한번이 클래스를 함수에 인터페이스하는 것은 일관성이 없습니다.
첫 번째 질문에 대한 추가 질문 : 함수 호출 중에도 이와 같은 문제가 발생하지 않습니까? 또는 바이너리로 컴파일 된 후에 아무런 문제가 없으며 유형이 더 이상 의미가 없습니까? 예를 들어 C 래퍼 인터페이스에 넣으면 RTTI 요소가 문제를 일으키지 않을까요?
"표준"이란 무엇입니까? 언어 표준은 ABI 보증을 제공하지 않습니다 (거의). 아이테니엄과 같은 ABI 표준은 물론 vtable 등을 포함합니다. 표준 라이브러리 유형 간의 ABI 호환성은 구체적인 구현의 영역이됩니다. –
@BaummitAugen 물론입니다. C++ 표준에는 ABI 보증이 없습니다. 그게 내 질문의 일부 야. 미안 해요, 당신이 진술을하든 진술을하는지 이해하지 못합니다. –
나는 왜 "C++ 라이브러리를 포팅 할 수 없는가?"라는 질문을 이해하려고 노력하고 있습니다. * 언어 표준만을 살펴보면 ABI 호환성을 처음부터 다루지 못하기 때문에 이상한 질문입니다. vtable조차도 구현 세부 사항이므로 종료 할 필요가 없습니다. 구현에서 제공하는 보증을 포함하면 해당 진술은 사실이 아닙니다. x86_64 용 Linux의 사전 빌드 된 패키지와 같은 특정 아키텍처의 C++ 코드에서 이진 파일 (라이브러리 및 실행 파일)을 이식 가능하게 빌드하고 제공 할 수 있습니다. –