문제

C++로 프로젝트를 빌드할 때, 특히 다른 사람의 코드를 선택할 때 연결 오류를 디버깅하는 것이 까다롭다는 것을 알았습니다.사람들은 연결 오류를 디버깅하고 수정하기 위해 어떤 전략을 사용합니까?

도움이 되었습니까?

해결책

귀하의 전문 지식 수준이 어느 정도인지는 확실하지 않지만 기본 사항은 다음과 같습니다.

아래는 VS 2005의 링커 오류입니다. 예, 익숙하지 않다면 큰 혼란이 될 것입니다.

ByteComparator.obj : error LNK2019: unresolved external symbol "int __cdecl does_not_exist(void)" (?does_not_exist@@YAHXZ) referenced in function "void __cdecl TextScan(struct FileTextStats &,char const *,char const *,bool,bool,__int64)" (?TextScan@@YAXAAUFileTextStats@@PBD1_N2_J@Z)

집중해야 할 몇 가지 사항이 있습니다.

  • "ByteComparator.obj" - ByteComparator.cpp 파일을 찾으세요. 이것이 링커 문제의 원인입니다.
  • "int __cdecl does_not_exist(void)" - 찾을 수 없는 기호입니다. 이 경우 does_not_exist()라는 함수입니다.

이 시점에서 대부분의 경우 가장 빠른 해결 방법은 이 함수에 대한 코드 기반을 검색하고 구현 위치를 찾는 것입니다.기능이 구현된 위치를 알고 나면 두 위치가 서로 연결되는지 확인하면 됩니다.

VS2005를 사용하는 경우 "프로젝트 종속성..." 마우스 오른쪽 버튼 클릭 메뉴를 사용합니다.gcc를 사용하는 경우 makefile에서 실행 파일 생성 단계(여러 .o 파일과 함께 호출되는 gcc)를 찾아 누락된 .o 파일을 추가합니다.


두 번째 시나리오에서는 코드가 없는 "외부" 종속성이 누락될 수 있습니다.Win32 라이브러리는 연결해야 하는 정적 라이브러리에서 구현되는 경우가 많습니다.이 경우 다음으로 이동하십시오. MSDN 또는 "마이크로소프트 구글" API를 검색해 보세요.API 설명 하단에 라이브러리 이름이 제공됩니다.이를 프로젝트 속성 "구성 속성->링커->입력->추가 종속성" 목록에 추가합니다.예를 들어, timeGetTime() 함수의 MSDN 페이지 페이지 하단에 Winmm.lib를 사용하라고 알려줍니다.

다른 팁

C 런타임 라이브러리가 가장 큰 원인인 경우가 많습니다.모든 프로젝트가 단일 대 멀티 스레딩, 정적 대 dll에 대해 동일한 설정을 가지고 있는지 확인하십시오.

MSDN 문서는 특정 Win32 API 호출이 누락된 경우 필요한 lib를 지적하는 데 유용합니다.

그 외에는 일반적으로 장황한 플래그를 켜고 단서를 찾기 위해 출력을 살펴보는 것으로 귀결됩니다.

제가 겪었던 일반적인 연결 오류 중 하나는 함수가 정의된 방식과 다르게 사용될 때입니다.이러한 오류가 표시되면 사용하는 모든 함수가 일부 .h 파일에서 올바르게 선언되었는지 확인해야 합니다.
또한 모든 관련 소스 파일이 동일한 lib 파일로 컴파일되었는지 확인해야 합니다.제가 겪었던 오류는 두 개의 별도 라이브러리로 컴파일된 두 개의 파일 세트가 있고 라이브러리 간에 교차 호출할 때 발생합니다.

당신이 염두에 두고 있는 실패가 있나요?

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