2014-04-15 1 views
0

많은 시간을 물어 보는 유사한 질문을 알고 있습니다. 하지만 아직 계획 단계에 있으므로 시작하기 전에 올바른 방향을 찾을 수 있기를 바랍니다.c와 C++ 라이브러리 (멀티 유닉스 플랫폼)을 섞음

제 경우는 다음과 같습니다. C에서 다른 C++ 라이브러리를 사용해야하는 범용 라이브러리를 작성해야합니다. 그들은 모두 C99와 posix 표준으로 작성되었습니다.

이 C 라이브러리는 모든 종류의 프로그램 (C, C++)에 의해 호출되며 AIX, HP-UX, Linux, Solaris와 같은 다중 유닉스 계열 플랫폼에서 실행됩니다.

누군가가 나에게 가능하지 않다고 말했습니다. 사실입니까? extern "C"를 표시해야하는 C++ 라이브러리의

1) 모든 수출 기능 :

+1

C++ 라이브러리에 "extern C"함수가 있거나이 코드를 –

+0

이라고 부를 수 없습니다. 그런 인터페이스가 없으면 C++ 코드를 'extern C'wrapper로 작성해야합니다 C++ 라이브러리를 호출하는 함수 - 특히 C++ 라이브러리가 오픈 소스가 아니며 수정할 수없는 경우 - C 라이브러리에서 해당 래퍼를 사용합니다. – JohnH

답변

5

예는 다음을 관찰 할 수있다.

2) C 및 C++ 라이브러리간에 일반 오래된 데이터 형식 (POD) 만 전달합니다. 은 구조가 없지만 요소를 일관되게 포장해야합니다.

3) C 라이브러리에 메모리를 할당하지 말고 C 라이브러리에서 메모리를 해제하거나 그 반대의 경우도 마찬가지입니다. 문자열 할당은 특히 고통 스러울 수 있습니다. 일반적으로해야 할 일은 크기가있는 버퍼를 전달하는 것이며 함수는 해당 버퍼에 쓸 수있는 데이터의 양을 반환합니다.

4) 라이브러리 경계에 예외를 발생시키지 마십시오. C++ 라이브러리에서 각 스레드에 바인딩 된 오류 정보 유형 객체 사용 (std::this_thread 등으로 C++ 11에서 쉽게)

1

공유 객체 (예 : 이해하기 쉽도록 dll)를 만들려고합니다. 여러 클라이언트가 다른 운영 체제를 사용하는 동안 액세스해야합니다 ...

클라이언트 (AIX, HP-UX, Linux, Solaris)가 C++ 인터페이스를 통해 C 라이브러리와 인터페이스하자마자 ?). 사실, .so에 액세스하는 C++ 인터페이스이기 때문에 문제가 표시되지 않습니다. 공유 객체를 직접 사용해야하는 경우, 서로 호환되지 않는 각 OS에 대해 여러 번 컴파일해야하고 (아마도 컴파일하게하고) 올바른 버전을 보내야한다는 것을 두려워합니다. 그렇다고 생각하지 않습니다. 필요.