2010-02-25 4 views
0

함수 출력이 QString 대신 std :: string 인 다른 라이브러리를 사용하는 Qt 앱이 있습니다. 내 외부 lib 디렉토리가없는 빈 표준 : : 문자열 모든 것이 잘 작동 반환하면 std :: string with Qt를 사용하면 파기시 런타임 오류가 발생합니다.

그래서 내 프로그램에서 나는 방법을

void doSomething() { 
... 
std::string std_string = MyExternalLibraryThatReturnsSTLstring.getString(); 
QString myQString = QString::fromStdString(std_string); 
... 
process(myQString); 
... 
} 

있습니다. 그러나 빈 std :: string이 반환되면 응용 프로그램이 범위 끝에서 충돌합니다. 나는 std :: string 객체 (?)의 파괴와 관련이 있다고 생각했다.

QString으로의 변환도 빈 표준 : : 문자열, 잘 작동합니다.

누군가는이 일이 내 이유를 말해 줄 수, 그리고 어떻게 런타임 오류를 피하기 위해?

(다른 스레드에서 어떤 사람들은 디버그의 혼합을 논의 라이브러리를 출시,하지만 난 그 짓을 생각 해달라고했다. BTW 찾는 방법?)

답변

0

사용 "종속성 워커는"볼 DLL의 어떤에 귀하의 응용 프로그램 (및 외부 DLL 및 QT DLL) 의존하고 있습니다.

+0

ok .. 나는 그것을했고 그것은 단지 많은 것들을 사용하는 표준 Qt libs + my external.dll만을 사용했다. 나는 틀린 것이나 여기에없는 것이 있는지 정말로 알 수 없다. 그러나 그것은 그것처럼 보이지 않는다. – Magus

1

해결 방법은 Qt 버전이 응용 프로그램과 동일한 컴파일러로 컴파일되어 있는지 확인하는 것입니다.

내 경우 VS2008로 미리 빌드 된 Qt 4.7.3을 다운로드했습니다. VS2010으로 이동하면 toStdString이 내 앱을 중단시키는 원인이되었습니다. 또한 STL 문자열을 사용하여 다른 이상한 오류가 발생합니다.

그래서 릴리스를 구성하고 VS2010 컴파일러로 다시 만듭니다. 당신이 (패트릭 알) 종속성 워커를 사용하여 볼 필요가 무엇

0

는 MSVC 런타임 libs와 (MSVCRT 친구)의 다른 버전이며, 그들은 사이 메모리를 교환하는 일이 다른 DLL 년대에 사용하는 경우 그들.

힙이 런타임 dll에 보관되므로 런타임마다 자체 힙 (예 : 2008, 2010, 2005)이 있으므로 중요한 부분입니다.

따라서 하나의 dll에 메모리를 할당하고 (예 : 16자가 넘는 std :: string을 작성하여) 다른 dll로 보내면 (범위 끝에서), delete 호출 새로운 위치에서와 다른 힙으로 이동합니다. 에드와 크래시가 발생합니다.

그래서 창에 DLL을 통해 STL 호환성을 위해, 같은 컴파일러를 사용해야합니다.

DLL이 항상 자신의 메모리를 비울 수있는 API를 노출하는 경우 그러한 문제는 없습니다. (즉, COM이나 유사하지만 덜 끔찍한 것으로 생각하십시오).

ABI 비 호환성이있을 수도 있지만 그 점에 대해서는 확신 할 수 없습니다. 수년에 걸쳐, 나는 주로 메모리 할당/해제 문제에 물 렸습니다.

관련 문제