2011-08-19 4 views
0

런타임시 특정 모듈 (공유 라이브러리)을로드하는 크로스 플랫폼 프로그램을 C++로 작성하려고합니다. 이렇게하려면 Poco C++ Libraries에서 ClassLoader를 사용하고 있습니다. 필자는 autoconf, automake 및 libtool을 사용하여 컴파일 체인을 작성했습니다. 이 문제는 Linux 환경에서는 문제가되지 않지만 Windows에서는 문제가 발생합니다. 내 Makefile을 사용할 수 있도록 컴파일 할 때 MinGW 및 MSYS를 사용하고 있습니다. ClassLoader는 Windows 관련 LoadLibrary() 함수를 사용하여 모듈을로드합니다. 즉 DLL로 컴파일해야합니다.Windows에서 Libtool 및 LoadLibrary()가있는 모듈

라이브러리로 컴파일하는 클래스는 주 응용 프로그램 내에서 다른 클래스를 상속합니다. 그런 다음 make를 실행하려고하면 정의되지 않은 참조에 대해 많은 것을 불평하고 공유 라이브러리를 작성하기를 거부합니다. 나는 이것이 mangling이라는 이름 때문이라고 생각합니다. 아니면 도서관 외부의 수업을 상속받을 수 없기 때문입니까? (그 클래스는 라이브러리의 소스에 포함되어 있지 않지만 헤더 파일이 있습니다.)

MinGW + MSYS에서 컴파일을 고집하지만 아직도 사용하고있는 것은 얼마나 어려울 지 모르겠습니다. 의 LoadLibrary(). 이 경험이있는 사람은 누구입니까?

+0

나는 MinGW/libtool을 사용하여 DLL을 빌드 할 때 'LoadLibrary'를 너무 많이 사용하지 않고 사용했습니다. 귀하의 문제는 C++/DLL 믹스와 관련이있을 수 있습니다. 문제를 보여주는 (짧은) 샘플 코드가 유용 할 수 있습니다. – rodrigo

+0

감사합니다. MinGW + LoadLibrary 조합은 문제가 아니라 오히려 어떻게 링크되었는지 밝혀졌습니다. 모든 공통 클래스를 하나의 공유 라이브러리에두고 실행 파일과 모듈 모두에 링크했습니다. – roggan87

답변

0

Windows에서 DLL은 빌드 할 때 의 모든 기호가 해석되어야합니다. Unix에서는,로드 타임까지 일을 미해결 상태로 남겨 둘 수가있어,이 동작은 현재 설계에 반영되고 있습니다.

변경하려면 기본 응용 프로그램 (및 DLL이 사용하는 다른 모든 항목)의 기본 클래스를 자체 DLL로 분해해야합니다. 그렇게하면 하위 클래스의 라이브러리를 링크 할 때 새 DLL에 링크하여 심볼을 완전히 해석 할 수 있습니다. catch는 모든 새로운 DLL을 빌드 할 수 있어야합니다.