문제

저는 Qt(gui lib), VTK(graphics lib) 및 너무 모호한 다른 라이브러리를 사용하는 C++ 프로젝트를 작업 중입니다. 이름은 언급하지 않고 대신 LIB_X라고 부르겠습니다.이 프로젝트는 GUI 구성 요소에 Qt를 사용하고 형상 렌더링에 VTK(보다 정확하게는 Qt를 지원하는 VTK에서 제공하는 QVTKWidget 확장)를 사용합니다.LIB_X를 사용하여 형상을 수집하고 조작합니다.

문제는 LIB_X가 실제로 VTK를 사용한다는 것이 밝혀졌다는 것입니다(어디서 어떻게, 비공개 소스인지는 모르겠습니다).처음에는 문제가 없었습니다. 연결된 두 라이브러리를 사용하여 컴파일하는 것은 잘 진행되었지만 어느 시점에서 특정(그리고 매우 필요한) LIB_X 함수를 호출하고 컴파일하면 '어쩌고 저쩌고 이미 정의된 VTK lib/obj에 대한 뭔가'라는 문제가 발생했습니다. LIB_X dll' 오류.

예를 들어(이것은 /FORCE:MULTIPLE과 함께 있으므로 여기서는 경고입니다. /FORCE:MULTIPLE 없이 오류를 원하는 경우 알려주시면 게시해 드리겠습니다.)

1>LIB_X.lib(LIB_X.dll) : warning LNK4006: "public: __thiscall std::vector<double,class std::allocator<double> >::~vector<double,class std::allocator<double> >(void)" (??1?$vector@NV?$allocator@N@std@@@std@@QAE@XZ) already defined in vtkCommon.lib(vtkInformationDoubleVectorKey.obj);

/FORCE:MULTIPLE을 사용해 보았고 처음에는 기적처럼 보였지만 대부분 힙 오류를 발생시키는 코드에서 무작위 오류가 발생했습니다.나는 메인 프로젝트에서 LIB_X에 대한 모든 참조를 제거하기로 결정하고 모든 LIB_X 항목을 처리할 정적 lib를 만들었습니다.저는 C++ 전문가가 아니기 때문에 미리 컴파일된 lib를 사용할 때 lib 충돌을 어떻게 처리하는지 잘 모르겠습니다. 하지만 정적 lib를 메인 프로젝트에 연결할 때 여전히 lib 충돌 오류가 발생했습니다. /FORCE:MULTIPLE을 사용해야 합니다.

정적 lib가 있으면 무작위 오류가 사라진 것처럼 보였습니다. 정적 lib를 통해 메인 프로젝트에서 LIB_X 메서드로 많은 작업을 수행할 수 있었지만 갑자기 메인 프로젝트의 클래스(복수의 std::벡터)를 사용했는데 갑자기 정적 라이브러리의 메서드 중 하나에서 힙 오류가 발생했습니다.새 데이터 멤버를 주석 처리하면 정적 라이브러리의 메서드가 제대로 실행됩니다.나는 현재의 오류를 언급하고 싶지 않습니다. 왜냐하면 솔직히 검토해 볼 가치가 있을지 확신할 수 없기 때문입니다. 그러나 도움이 될 수 있는 경우를 대비하여 다음과 같이 설명합니다.

메모:약 151번째 줄에서 xutility에 충돌이 발생하고 다음과 같은 주장이 나타납니다."파일:dbgheap.c 라인:1279 표현:_CrtIsValidHeapPointer(pUserData)"

오류는 벡터 벡터 벡터 double을 벡터 벡터 벡터 double에 추가한 후 발생하며 push_back 라인에서 충돌이 발생합니다.

std::vector<std::vector<double>> tmpVec;
for(srvl_iter = srvl.begin(); srvl_iter != srvl.end(); ++srvl_iter)
{
 tmpVec.push_back((*srvl_iter).getControlPoints());
}
this->_splines.push_back(tmpVec); //CRASH

내 메인 프로젝트에 새 데이터 멤버를 추가했을 때만(정적 라이브러리와는 별도로!) 여기서 충돌이 발생하기 시작했습니다. 새 데이터 멤버를 주석 처리하면 오류가 사라집니다.

std::vector<std::vector<std::vector<double>>> _geometry; 

따라서 /FORCE:MULTIPLE은 좋지 않은 것 같습니다. 이해가 되지 않는 임의의 오류가 발생합니다.다른 해결책이 있나요?내가 망한 걸까?LIB_X의 VTK 연결로 내가 할 수 있는 일이 있나요?

도움이 되었습니까?

해결책

나는 무리를 만났다 LNK4006 내 앱을 많이 사용하는 라이브러리(라이브러리 LIB_Y라고 함)에 연결할 때 오류가 발생합니다. std::vector<std::string>, 내 앱에서도 그랬습니다.약간의 실험 끝에 LIB_Y를 호출하는 별도의 DLL(예: LIB_Y_WRAPPER)에 LIB_Y를 래핑한 다음 LIB_Y_WRAPPER에 대해 기본 앱을 연결하는 한 가지 솔루션을 찾았습니다.

내 제안을 시험해 보려면 다음을 수행해야 합니다.

  1. "모든 LIB_X 항목을 처리하는 정적 lib"를 정적 LIB 프로젝트에서 DLL 프로젝트(LIB_X_WRAPPER라고 함)로 변경하세요.
  2. LIB_X_WRAPPER의 헤더 파일에 LIB_X 헤더 파일이 포함되어 있지 않은지 확인하세요.이것은 정말 중요한 래퍼는 LIB_X 헤더 파일에 선언된 데이터 유형(예: std::vector<double>).LIB_X_WRAPPER의 소스 파일 내에서 LIB_X의 헤더 파일만 참조하세요.
  3. DLL에서 내보내지도록 정적 라이브러리에 있는 모든 클래스와 함수의 선언을 변경합니다(참조: 이 답변 DLL에서 내보내기에 대한 세부 정보가 필요한 경우).

이 솔루션은 인스턴스화(컴파일러 생성 함수)를 유지했기 때문에 저에게 효과적이었습니다. std::vector<std::string> LIBY에서 사용하는 클래스는 인스턴스화와 완전히 별개입니다. std::vector<std::string> 내 앱에서.

여담으로, 나는 당신이 보고 있는 충돌의 원인이 의심스럽습니다(당신은 그것이 소멸자에 있다고 언급했습니다). std::vector<double>)는 인스턴스화 때문입니다. std::vector<double> 앱의 내용은 LIB_X의 내용과 다릅니다.

다른 팁

주석 처리는 아마도 무작위 운일 것입니다. 힙을 손상시키는 경우 항상 즉시 볼 수는 없지만 stl 벡터는 항목을 왼쪽과 오른쪽으로 할당 및 할당 해제하므로 오류를 찾는 것이 당연합니다.

일부 라이브러리에서는 특정 순서로 항목을 포함해야 합니다.왜 그런지는 잘 모르겠지만, 제가 보기에는 라이브러리를 제대로 디자인할 수 없다고 포기하는 것처럼 들리는데, 안타까운 사실입니다.vtk를 포함하는 곳에 이 lib_x를 포함하지 않는 한 괜찮을 것입니다.

그러나 그들은 일부 자원을 놓고 싸우거나 무언가를 부적절하게 사용하여 함께 일할 수 없게 만들 수도 있습니다.컴파일을 분리하여 제대로 작동하도록 할 수 있고 여전히 실패한다면 예, 운이 좋지 않은 것입니다. 왜냐하면 이 lib_x가 설계된 방식에 실패했을 뿐이고 너무 모호하기 때문에 실패했을 가능성이 없기 때문입니다. 모든 용도에 대해 철저하게 디버깅되었습니다.어떤 것이 널리 사용되지 않으면 일반적으로 개발자의 컴퓨터와 프로젝트에서는 작동하지만 반드시 다른 사람의 것은 아닐 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top