2012-01-17 3 views
0

Borland 6을 사용하여 기존 응용 프로그램에 MinGW로 만든 라이브러리를 컴파일했습니다 (예전에 알고 있지만 그게 전부였습니다). 나는 .lib 파일을 생성하기 위해 implib을 사용하고 이것을 내 프로젝트로 가져 왔습니다. 또한 dll과 필요한 헤더 파일에 경로를 추가했습니다.다른 컴파일러에서 dll 가져 오기

내가 컴파일하려고하면 Unnresolved 외부 유형 오류 더미가 나타납니다. 수입 과정의 모든 단계를 빠뜨린 적이 있습니까? 내가 가지고 있지 않다고 가정하면이 문제는 이름 - mangling과 같은 것입니다. 이름 변환이 중요하지 않은 방식으로 인터페이스를 작성하는 방법은 무엇입니까? 나는 그것이 내 지식의 한계에 관한 외부 C를 포함한다는 것을 안다. DLL 외부에서 액세스해야하는 클래스는 두 개 뿐이며 나머지는 모두 내부적으로 만 사용됩니다. extern C를 클래스로 완전히 빌드 된 무언가로 사용하는 방법을 잘 모르겠습니다. 나는 볼랜드 (Bland)에서 가져 오는 것이기를 희망합니다.

+0

문제와 관련하여 FAQ (코드 예제 포함)가 있습니다. 그것이 주로 리눅스에 관한 것이라는 점에 유의하십시오. 하지만 어쨌든 도움이되기를 바랍니다. http://www.faqs.org/docs/Linux-mini/C++-dlopen.html –

답변

0

extern "C"는 클래스에는 사용할 수 없으며, 무료 함수에만 사용할 수 있습니다. 따라서 클래스에 "C"인터페이스를 작성할 수있는 옵션이 있습니다. 각 함수는 클래스에 대한 포인터를 사용하며 작성 및 삭제 기능을 제공합니다.

이것은 일반적으로 수행되는 방법이며 클래스는 struct와 같이 클래스로 선언 될 수 있으며 클래스로 선언 된 다음 C로 작성된 응용 프로그램에서도 사용할 수 있습니다. 일반적으로 extern "C" __cplusplus가 정의되어있을 때만 #ifdef 경비가 정상적으로 발생합니다.

C++에서 클래스를 사용하고 모든 클래스 메소드에 대해 C 인터페이스를 작성하지 않으려면 다른 옵션이 있습니다.

DLL을 사용하는 사용자는 추상 인터페이스를 사용하지만 추상 인터페이스에 대한 포인터를 생성하기 위해 Create 및 Destroy 메서드 (extern "C"사용)를 계속 사용하지만 일반적인 C++ 방식으로 포인터를 사용합니다. 당연히 스마트 포인터에이 포인터를 래핑하는 것이 이상적입니다. Destroy 메서드를 호출하는 사용자 지정 deleter를 사용하여 shared_ptr을 향상시킵니다. 라이브러리 사용자는 그렇게해야하지만 헤더 전용 인터페이스를 제공 할 수 있습니다.

이렇게하는 경우주의해야 할 몇 가지 다른 문제가 있습니다. 런타임 유형 정보와 관련이있는 것은 예외를 포함하여 사용자 측에서 작동하지 않을 가능성이 큽니다. 그리고 다시 한 번 라이브러리가 C++ 방식으로이를 처리 할 수있는 "오픈 소스"C++ 래퍼 (클라이언트 측에서 컴파일 됨)를 제공 할 수 있습니다. 일종의 pImpl.

+0

고맙습니다. 교육적인 날이되어 줄 수 있습니다. 수업을 하나로 따로 작업을하지 않으려면 오랜 시간이 걸리므로 반발의 위험이 있습니다.이 클래스를 싱글 톤으로 만들고 C 스타일 함수를 사용하면 어떤 이점이 있습니까? – Bowler

+0

싱글 톤이 필요한 이유가 무엇입니까? 그 중 하나만 가지고 있어야하고 매개 변수로 전달하지 않고도 전역 적으로 사용할 수 있어야하는 경우 완료됩니다. – CashCow

+0

인터페이스 클래스의 인스턴스가 하나 밖에 없으므로, '관리자'유형의 클래스가있을 때 싱글 톤 습관을 버리려고했습니다. C 함수가 호출 할 단일 포인터가 있기 때문에 유용할지 여부를 궁금해했습니다. 문제를 해결하는 데 도움이되지 않을 수도 있습니다. – Bowler

0

컴파일러 전체에서 이름 변환이 표준화되지 않았습니다. extern C 기능 만 노출되어 이름이 엉망이되지 않도록하십시오. 그러나 이것은 객체 지향 프로그래밍을 사용할 수 없다는 한계가 있습니다.

또 다른 옵션은 이진 호환 COM 개체를 구현하는 것입니다.

관련 문제