2015-02-02 1 views
-2

여기는 내 첫 번째 질문이므로 실수가 있으면 사과하고 가능한 구체적으로하려고 노력할 것입니다. 우리는 언어와 컴파일러에서 사용할 수 있도록 C++ POSIX OO 크로스 플랫폼 라이브러리를 개발해야합니다. 우리는이 라이브러리를 Windows, Linux 및 Android와 같은 다른 운영 체제 및 Integrity와 같은 일부 내장형 OS에서도 사용할 수 있어야하므로 Cygwin 또는 Mingw에서 개발하기로 결정했습니다. 라이브러리 자체는 C++ Object Oriented 코드, POSIX 표준이 될 것입니다. 이미 언급했듯이이 라이브러리를 다른 언어로로드하고 사용할 수 있어야합니다. 따라서 관리 코드에서이 라이브러리를 사용할 수 있으려면 관리되지 않는 MS Visual C++ 코드로 먼저이 라이브러리를 래핑하는 것이 좋습니다. 여기서 우리는 다양한 문제에 직면하게 될 것입니다. Visual C++는 다른 컴파일러를 사용하기 때문에 Cygwin/Mingw에서 컴파일 된 C++ 라이브러리를 링크하는 것은 거의 불가능합니다. 주요 쟁점은 맹 글링 (mangling)이라는 이름이고 다른 구조 정렬 문제, 기본 예외 및 메모리 모델의 충돌에 따른다. 다른 옵션은 동일한 코드를 가지고 있지만 Cygwin과 MS Visual C++ 같은 다른 컴파일러로 컴파일하는 것입니다. 이 옵션의 문제점은 Visual C++ 컴파일러가 POSIX를 지원하지 않는다는 것입니다.언어와 컴파일러에서 사용할 수있는 C++ POSIX OO 크로스 플랫폼 라이브러리

그래서 누구에게도 동일한 문제가 발생 했습니까? 그러한 라이브러리를 개발하는 방법이나 적어도 다른 컴파일러의 코드를 재사용하는 방법에 대한 아이디어가 있습니까?

이 문제에 대한 도움을 주시면 감사하겠습니다. 감사합니다.

+1

소스에서 컴파일해야하며 C++ 환경에는 일반적인 바이너리 호환성이 없습니다. 그리고 플랫폼마다 다른 플랫폼 전용 코드가 필요합니다. Qt와 같은 기존 프레임 워크를 연구합니다. – hyde

+0

감사합니다. Hyde, 가능한 솔루션을 찾기 위해 계속해서 C++ 환경에서 바이너리 호환성이 전혀 없음을 알게되었습니다. Qt 프레임 워크에 익숙하지만 유감스럽게도 사용할 수는 없습니다. – Igor

답변

0

이 솔루션은 C++ 클래스의 "평평한"C 래퍼를 제공하는 것입니다 (이 개념은 Rudy Velthuis의 많은 부분에서 빌려 왔습니다 : http://rvelthuis.de/articles/articles-cppobjs.html 참조). 클래스를 병합하려면 생성자 및 소멸자뿐만 아니라 각 클래스 멤버 함수에 대한 C 함수를 만듭니다. 생성자에 대한 C 랩퍼는 해당 클래스의 오브젝트에 대한 포인터를 리턴합니다. 소멸자를 포함하여 다른 멤버 함수에 대한 래퍼는이 포인터를 첫 번째 인수로 사용합니다. 이러한 C 래퍼는 DLL에서 내 보낸 extern "C"선언이 있어야하며 C++ 객체에 대한 간접 액세스를 제공합니다 (자세한 내용은 http://www.aaronreeves.com/windows-dlls-part-3). 결과적으로 외부 DLL에 이러한 DLL은 C로 작성된 DLL처럼 보일 것입니다. C로 작성된 DLL은 다양한 소스의 EXE와 매우 잘 작동합니다.