문제

내 프로젝트에서 암시 적 링크를 사용하고 싶고 nmake는 실제로 .def 파일을 원합니다. 문제는 이것이 수업이고 수출 섹션에서 무엇을 쓸지 모르겠습니다. 누구든지 나를 올바른 방향으로 가리킬 수 있습니까?

오류 메시지는 다음과 같습니다.

Nmake : U1073 : 'dllclass.def'를 만드는 방법을 모르겠습니다.

추신 : Windows CE 플랫폼 빌더를 사용하여 빌드하려고합니다.

도움이 되었습니까?

해결책

사용하여 항상 멤버 함수의 장식 이름을 찾을 수 있습니다. 덤프 빈 /기호 myclass.obj

나의 경우에는

class A {
   public:
     A( int ){}
};

그만큼 dumpbin 덤프는 기호를 보여주었습니다 ??0A@@QAE@H@Z (public: __thiscall A::A(int))

이 기호를 .def 파일에 넣으면 링커가 내보내기 기호에서 a :: a (int) 기호를 만들 수 있습니다.

하지만! @Paercebal이 그의 의견에서 언급 한 바와 같이 : 장식 된 (Mangled) 이름의 수동 항목은 집안일이되기 쉽고 슬프게도 충분히 컴파일러 버전에서 휴대 할 수있는 것이 아닙니다.

다른 팁

내가 올바르게 기억하면 사용할 수 있습니다 __declspec(dllexport)수업, 및 VC ++는 클래스와 관련된 모든 기호 (생성자/파괴자, 메소드, vtable, typeinfo 등)에 대한 내보내기를 자동으로 생성합니다.

Microsoft에는 이에 대한 자세한 정보가 있습니다 여기.

나는 추상 공장이 될 최고의 경로를 발견했습니다.

순수한 가상 기본 클래스를 정의하여 시작하십시오. 이것은 순수한 가상 인터페이스 클래스 인 구현이없는 클래스입니다.

이 가상 기반 "Abstract Interface"클래스를 내보낼 수 있지만 그렇게 할 이유는 없습니다. 발신자가 사용하면 포인터 (PIMPL 또는 구현에 대한 포인터)를 통해이를 사용하므로 모든 발신자가 간단한 메모리 주소입니다. DEF 파일은 TEENESY BIT 더 많은 작업을 수행하지만 __declSpec (DLLEXPORT)가 얻을 수있는 것 이상의 이점을 제공합니다. 어떤 이점이 있습니까? 우리는 그것에 도달 할 것입니다, 당신은 그냥 기다립니다.

실제 클래스가 가상 기반에서 공개적으로 상속 받도록하십시오. 이제 객체를 구성하는 공장 방법을 만들고 A "풀어 주다"정리를 수행하기위한 ISH Callable Destructor.이 방법을 이름을 지정하십시오."ConstructMyClass" 그리고 "릴리스미 클래스". 제발 교체 해주세요"내 수업" :-)

해당 공장 / 릴리스 방법은 매개 변수가 필요한 경우 POD 유형 만 취해야합니다 (일반 데이터 : 정수, 숯 등). 리턴 유형은 가상 추상 인터페이스 기본 클래스이거나 오히려 포인터 여야합니다.

imyclass* CreateEanObjectOfTypeimyClass ();

아마도 우리가 가상 기본 클래스가 필요한 이유가 분명할까요? 가상 인터페이스 클래스에는 구현이 없기 때문에 본질적으로 모든 POD 유형 (정렬)이므로 클래스의 "데이터 유형"은 Visual Basic, C 또는 크게 다른 C ++ 컴파일러와 같은 대부분의 발신자가 이해할 수 있습니다.

당신이 충분히 화려하다면, 당신은 "필요를 해결할 수 있습니다"수동 릴리스"방법 (죄송합니다.해야했습니다). 어떻게? 스마트 포인터와 PIMPL 유형의 아키텍처를 통해 클래스에서 자신의 리소스를 관리하므로 객체가 죽을 때 그 자체로 정리됩니다. 그렇게하는 것은 수업입니다. 우리 성도와 구주의 불멸의 말로 Scott Meyers, "올바르게 사용하기 쉽고 잘못 사용하기가 어렵습니다" 발신자가 청소의 필요성을 무시하게함으로써. 전화를 잊지 않은 우리 사이에있는 사람들은 ".닫다"첫 번째 돌을 캐스팅하십시오.

어쩌면이 아키텍처가 친숙하게 들리나요? 그것은 기본적으로 Com의 마이크로 마이크 버전입니다. 글쎄, 적어도 인터페이스, 공장 구조 및 릴리스에 대한 개념입니다.

결국 당신은 당신의 클래스의 인터페이스를 내보내고, 만들었습니다 (그리고 수출). 만들다 그리고 파괴하다 방법, 이제 발신자가 귀하를 호출 할 수 있습니다 PleaseConstructMyClass 공장 기능 DLL이 인터페이스의 모습으로 완전히 구성되고 완전히 구현되고 완전히 구워진 물체를 반환하도록합니다. 그들은 당신의 수업의 모든 공개 방법 (적어도 추상 가상 인터페이스에있는 방법)을 부를 수 있고 모든 재미있는 일을 할 수 있습니다.

공장 기능에 의해 반환 된 개체로 끝나면 A를 호출 할 수 있습니다.릴리스미 클래스"DLL에게 DLL에게 물체의 자원을 정리하도록 요청하거나, 수업을 스스로 정리하고, 만들어 도와 줄 수 있습니다."릴리스미 클래스"방법은 중복되고 쓸모가 없습니다.

DEF 파일과 인터페이스를 사용하기위한 특정 이익 및 트레이드 오프에 관심이있는 사람이라면 (내 블라인드 Say-So)를 제외하고는 파이프를 두십시오.

이 물건을 좋아하지 않습니까?

솔루션은 다음과 같습니다.

  • 클래스가 내보내므로 .def 파일에 내보내는 메소드를 추가해야합니다.

  • 생성자를 내보내는 방법을 찾지 못했기 때문에 공장 방법 (정적)을 사용하여 새로운 인스턴스를 반환합니다.

  • 다른 기능은 .def 파일에 정상 내보내기 선언을 추가하여 내보낼 것입니다.

누군가 가이 정보로부터 혜택을 받기를 바랍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top