2011-11-18 2 views
2

라이브러리 함수를 작성 중이므로 vectors & maps과 같은 인수를 전달할 수 있어야합니다. 라이브러리와 실행 파일 같은 컴파일러 & 설정을 사용하여 컴파일 된 않는Qt 컨테이너를 매개 변수로 공유 라이브러리의 함수에 전달할 수 있습니까?

나는 당신이 도서관 때문에 바이너리 호환성 문제

std::map<int> FixMap(const std::map<int> &); 

의 헤더에서 선언 STL 매개 변수와 함수를 가질 수 없습니다 알고있다. 다음Qt는 템플릿 라이브러리를 사용하여

하나 다른 한편으로는, 그들이 제공하는 DLL이 아마 나보다 다른 컴파일러로 컴파일 된 경우에도

QMap<int> FixMap(const QMap<int> &); 

작동합니다.

어떤 기술 않는 자신의 QMap, QValueList는, QString는 극복이 호환성 문제와 Qt는 사용?

코드를 조금 읽었지만 기술을 격리 할 수는 없습니다.

질문 1 : 질문 : 기술을 적용하는 코드를 작성하는 방법에 대해 누군가가 나에게 설명해 줄 수 있습니까?

불투명 포인터string/map을 제공하거나 pImpl 관용구를 사용하고 작동 내가 아는 유일한 기술.

질문 2 : 이러한 종류의 호출을 수행하기 위해 '기본'STL 헤더 대신 STLPort를 사용할 수 있습니까? 이것이 STL의 성능에 어떤 영향을 미칩니 까?

+1

코드가 실제로 미리 컴파일 된 바이너리를 참조하고 있습니까? 일반적으로 템플릿 코드는 사용 될 때마다 항상 새로 컴파일됩니다. (템플릿을 "컴파일"할 수는 없습니다.) –

+1

"qt 기술"을 사용하더라도 다른 컴파일러/설정으로 컴파일 할 때 문제가 발생하기 쉽습니다. 단지 몇 번에서 공유 라이브러리를 대체 할 수있는 프로그램을 다시 컴파일 할 필요없이 저장할 수 있습니다. – PlasmaHH

답변

0

첫 번째 예제는 사용중인 컴파일러와 다른 컴파일러를 사용하여 라이브러리를 작성한 경우에도 두 번째 예제와 마찬가지로 괜찮습니다. 중요한 것은 Application Binary Interface 또는 간단히 말해서 ABI가 프로그램과 라이브러리에서 모두 동일하다는 것입니다.

Qt는 라이브러리를 만들 때 특별한 것을 사용하지 않습니다.

+0

그러면'std :: map 과 같은 함수를 내보낼 때 실제로 문제가 생깁니다. FixMap (const std :: map &);'내 질문에 '공유 라이브러리의 STL 매개 변수로 함수 호출하기'를 참조했습니다. –

+0

@GrimFandango 오류를 제공하지 않으면 알 수 없습니다. –

+0

첫 번째 예가 설명 된 문제 ** Sutter ** 및 ** Alexandrescu **에 의해 책 ** C++ 코딩 표준 **의 63 항목에 자세히 설명되어 있습니다. –

관련 문제