2016-08-15 3 views
1

Xerces-c-3.1.4 DLL을 사용하는 방법을 배우려합니다. 소스를 다운로드하고 VS Studio Express 2015의 xerces-all.sln을 사용하여 DLL을 만들었습니다.해결되지 않은 외부 'xercesc_3_1 :: XMLPlatformUtils :: Initialize'C++ Builder 테스트 응용 프로그램

매우 간단한 VCL 앱 (양식의 버튼)을 작성했습니다. 이 세 가지 링커 오류 산출 :

Unresolved external 'xercesc_3_1::XMLPlatformUtils::Terminate() 
Unresolved external 'xercesc_3_1::XMLUni::fgXercescDefaultLocale 
Unresolved external 'xercesc_3_1::XMLPlatformUtils::Initialize() 

나에게 발생 가능한 원인은 다음과 같습니다

  • 내가 처리 할 .DEF 파일이 필요하지 마십시오 DLL을 빌드 할 때 뭔가 잘못 않았다
    • VC++ 이름 맹 글링으로? 하지만 .sln은 제공되지 않습니다.
    • 내가 사용하는 DLL 함수에 GetProcAddress를 호출 할 필요가 없습니까? 그러나 DLL의 모든 함수에 대한 템플릿은 어디에서 찾을 수 있습니까?

    여기 내 테스트 응용 프로그램에 대한 코드입니다 :

    #ifndef MainFrmH 
    #define MainFrmH 
    
    #include <System.Classes.hpp> 
    #include <Vcl.Controls.hpp> 
    #include <Vcl.StdCtrls.hpp> 
    #include <Vcl.Forms.hpp> 
    #include <xercesc/util/PlatformUtils.hpp> 
    #include <xercesc/util/XMLString.hpp> 
    #include <xercesc/dom/DOM.hpp> 
    #include <xercesc/util/OutOfMemoryException.hpp> 
    
    XERCES_CPP_NAMESPACE_USE 
    
    
    class TMainForm : public TForm 
    { 
    __published: // IDE-managed Components 
        TButton *InitButton; 
        void __fastcall InitButtonClick(TObject *Sender); 
    private: // User declarations 
        HINSTANCE hXercesLib; 
    public:  // User declarations 
        __fastcall TMainForm(TComponent* Owner); 
        __fastcall ~TMainForm(); 
    }; 
    
    extern PACKAGE TMainForm *MainForm; 
    
    #endif 
    
    #include <vcl.h> 
    #include <iostream> 
    #pragma hdrstop 
    
    #include "MainFrm.h" 
    
    #pragma package(smart_init) 
    #pragma resource "*.dfm" 
    TMainForm *MainForm; 
    
    using namespace xercesc; 
    
    __fastcall TMainForm::TMainForm(TComponent* Owner) 
        : TForm(Owner) 
    { 
        hXercesLib = NULL; 
    } // ctor 
    
    __fastcall TMainForm::~TMainForm() 
    { 
        if (hXercesLib) 
        { 
         XMLPlatformUtils::Terminate(); 
         FreeLibrary(hXercesLib); 
         hXercesLib = NULL; 
        } 
    } // dtor 
    
    void __fastcall TMainForm::InitButtonClick(TObject *Sender) 
    { 
        if (!hXercesLib) 
        { 
         hXercesLib = LoadLibrary("xerces-c_3_1.dll"); 
         try 
         { 
          XMLPlatformUtils::Initialize(); 
    
          ShowMessage("XMLPlatformUtils::Initialize succeeded"); 
         } 
         catch (Exception& e) 
         { 
          FreeLibrary(hXercesLib); 
          hXercesLib = NULL; 
          ShowMessage(e.Message); 
         } 
        } 
    } 
    
  • 답변

    1

    당신 사용 GetProcAddress()하지만 설정을 코드에 대한 더 많은 작업이다. C++ Builder의 명령 행 tdump.exe 도구를 사용하여 DLL의 내 보낸 함수 이름 목록을 가져올 수 있습니다.

    은 C++ Builder의 명령 줄 implib.exe 도구를 사용할 수도 있고 없어도됩니다. def 파일을 사용하여 DLL에 대한 정적 가져 오기 .lib 파일을 만든 다음 .lib 파일을 프로젝트에 추가하십시오.

    +0

    감사합니다. 솔루션에서 DEF 파일이없는 __cdecl 호출 규칙을 사용하는 것처럼 보입니다. 그래서 impdef mydef.def xerces_c_3_1.dll을 실행하고 "Warning ... : no exports"를 받았습니다. 꽤 큰 단서! 나는 파기와 실험을 계속하고이 빌드를 올바르게 만들기 위해 알아 내려고 노력할 것입니다. – Kathleen

    +0

    미래에이 스레드를 찾을 수있는 누군가를 위해, 솔루션은 Xerces의 빌드 지침에 대한 가정을하지 않기 위해서였습니다. Embarcadero CX10 시애틀 컴파일러로 MAKE 파일을 실행하는 "Borland"C++에 대한 권장 사항을 수행했으며 완벽하게 작동했습니다. – Kathleen