2012-09-22 2 views
1

저는 플러그인 시스템으로 크로스 플랫폼 C++/qt 프로젝트에서 작업하고 있습니다. 우리는 Windows에서 linux와 dll 파일을 사용하고 있습니다. cmake를 통해 Windows의 Linux 및 Visual Studio 2010에서 gcc를 사용하고 있습니다. 문제는 우리 플러그인이 때때로 헤더 파일을 포함하여 gcc가있는 Linux에서 제대로 작동하는 응용 프로그램 소스 코드에서 함수를 호출해야하는 경우입니다. 그러나 Visual Studio에서 해결되지 않은 외부 기호 오류가 발생했습니다.dll로 해결 된 외부 기호

그래서 dll 파일이 다르게 작동하기 때문입니까?

감사합니다.

답변

2

Windows에서 dll에서 심볼을 내보내는 기본 동작은 정반대입니다. 기본적으로 심볼은 표시되지 않으므로 심볼을 명시 적으로 내보내야합니다. VC++의 경우 이것은 __declspec(dllexport)declarators입니다.

EDIT (정보 추가) : 표준화되지 않은 시스템 특정 동작 영역에 들어가고 있습니다 ... C++에서 예상치 못한 크로스 플랫폼 "플러그 가능"구성 요소 시스템을 작성하는 것과 관련된 많은 문제가 있습니다. Windows에서 dll에서 내 보낸 모든 기호를 정의하는 가져 오기 라이브러리가 있습니다. 이러한 기호를 해결하려면 이러한 라이브러리에 연결해야합니다. 이를 implicit linking이라고합니다. 명시 적으로 링크 할 수도 있습니다. 즉, 런타임에 dll과 내 보낸 심볼을로드하는 것을 의미합니다. 그러나이 모든 것들은 바이너리 호환성 문제와 비교되는 기술적 인 세부 사항 일 뿐이며, 이는 컴포넌트 시스템을 설계하는 동안 고려되지 않는다면 거의 확실하게 당신을 죽일 것입니다.

한가지 궁금합니다. Qt를 사용하고 있다고하셨습니까? Qt 애플리케이션 프레임 워크는 플러그인 가능한 구성 요소를 작성하고 작성하기위한 자체 크로스 플랫폼 규칙 및 규칙을 가지고 있습니다. 왜 이걸로 붙이지 않는거야?

+0

그래,하지만 충분하지 않아. * .lib를 주 실행 파일과 연결해야하는 것 같습니다. – Jkmn

+0

나는 나의 대답을 편집했다. 조금 더 명확 해 졌으면 좋겠다 ... –

+0

고맙다. 그래서 내 DLL을 컴파일하려면 내 응용 프로그램에서 빌드 된 가져 오기 라이브러리를 링크해야합니까? 그게 날 괴롭히는거야. – Jkmn