2009-11-25 2 views
0

공유 클래스가 있습니다. 선언자는 공유 헤더에 있으며 구현은 주 프로그램에 있습니다. 주요 프로그램은 DLL과 exec 함수를로드하고 함수는 공유 클래스의 객체를 생성합니다.[windows] 다시 연결

테스트 코드 :

shared_header.h :

#include<stdio.h> 
class sharedClass{ 
public: 
sharedClass(); 
}; 

plugin.cpp -> libplugin.dll

#include"shared_header.h" 
extern "C" 
void loader(){ 
printf("Plugin is loaded!\n"); 
new sharedClass; 
} 

base.cpp -> base.exe

#include"shared_header.h" 
sharedClass::sharedClass(){ 
printf("Shared class is loaded!\n"); 
} 

int main(){ 
/* 
some actions to load libplugin.dll and exec function loader 
*/ 
return 0;} 

그래서보고 싶습니다.

Plugin is loaded! 
Shared class is loaded! 

그리고 Linux에서 작동합니다. 그러나 Windows에서 libplugin.dll을 링크하는 동안 "undefined refernce from sharedClass :: sharedClass()"오류가 발생합니다. 어떻게 이런 식으로 링크 프로그램과 플러그인이 필요합니까?

추신. Mingw, 안정 버전.

PPS. 나는 끔찍한 영어로 유감이다.

답변

1

Windows DLL은 UNIX/Linux 공유 객체와 정확히 동일하지 않습니다.

Windows에서 DLL은 완전히 연결되고 모든 참조가 정의되어 있어야합니다. 따라서 파일 plugin.cpp가 sharedClass 생성자를 참조하므로 링커에서는이 생성자가 정의되어 있고 DLL을 만들 수 있어야합니다. DLL을로드하는 실행 파일에 제공 할 수 없습니다.

UNIX/Linux에서 공유 객체는 다르게 동작합니다. 그들의 의존성은 실행 파일에 의해로드 될 때 해결됩니다. 따라서 실행 파일은 공유 객체에 필요한 일부 기능을 제공 할 수 있습니다.

+0

예,하지만 알고 있듯이 Windows에서 동일한 동작을 시뮬레이트하는 방법이 있습니다 ... – Staseg

+0

나는 그런 방법에 대해 모르겠다. 당신은 언제나 "손으로"할 수 있습니다. 누락 된 생성자에 대한 함수 포인터를 정의하고, DLL의 로딩 함수에서 DLL이 들어있는 EXE를로드하고 그 함수 포인터를 초기화해야합니다. –