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()
나에게 발생 가능한 원인은 다음과 같습니다
는- 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);
}
}
}
감사합니다. 솔루션에서 DEF 파일이없는 __cdecl 호출 규칙을 사용하는 것처럼 보입니다. 그래서 impdef mydef.def xerces_c_3_1.dll을 실행하고 "Warning ... : no exports"를 받았습니다. 꽤 큰 단서! 나는 파기와 실험을 계속하고이 빌드를 올바르게 만들기 위해 알아 내려고 노력할 것입니다. – Kathleen
미래에이 스레드를 찾을 수있는 누군가를 위해, 솔루션은 Xerces의 빌드 지침에 대한 가정을하지 않기 위해서였습니다. Embarcadero CX10 시애틀 컴파일러로 MAKE 파일을 실행하는 "Borland"C++에 대한 권장 사항을 수행했으며 완벽하게 작동했습니다. – Kathleen