문제

이것은 이전 사람이 4 년 전에 건설하고 설치 및 실행중인 Windows 콘솔 응용 프로그램 (실제로 서비스)입니다. 이제 몇 가지 변경을해야하지만 현재 버전을 구축 할 수도 없습니다! 빌드 출력은 다음과 같습니다.

--------------------Configuration: MyApp - Win32 Debug--------------------
Compiling resources...
Compiling...
Main.cpp
winsock.cpp
Linking...
LINK : warning LNK4098: defaultlib "LIBCMTD" conflicts with use of other libs; use /NODEFAULTLIB:library
Main.obj : error LNK2001: unresolved external symbol _socket_dontblock
Debug/MyApp.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.

MyApp.exe - 2 error(s), 1 warning(s)
--------------------------------------------------------------------------

내가 사용하는 경우 /NODEFAULTLIB 그런 다음 많은 오류가 발생합니다. 코드는 실제로 사용하지 않습니다 _socket_noblock 그러나 나는 '그물에서 아무것도 찾을 수 없습니다. 아마도 그것은 내가 링크하는 일부 라이브러리에서 사용되지만 그것이 어떤 라이브러리에 있는지 모르겠습니다.

--- Alistair.

도움이 되었습니까?

해결책 2

죄송합니다. 이것은 내부 문제로 판명되었습니다. 4 년 전 Maverick Coder와 녹슬지 않는 녹슨 (나!)의 조합.

코드는 사용하지 않습니다 _socket_noblock 그러나 그것은 하다 사용 socket_noblock 그리고 우리 자신의 도서관 중 하나에 연결하면됩니다.

다른 팁

LNK4098은 문제가되지 않을 수 있습니다. 예를 들어, 정적 런타임 링키지를 사용하는 일부 라이브러리의 릴리스 버전에 링크하고 LIBCMT ( "D"접미사의 부재)를 기본 라이브러리에 추가 할 수있는 경우 발생할 수 있습니다. 디버그 구성에 내장 된 응용 프로그램은 Libcmt를 사용합니다., 따라서 갈등. 해당 라이브러리와 런타임 의존적 인 것을 교환하지 않는다면 실제로 안전 할 수 있습니다.

에 관해서 _socket_noblock, 일부 검색 유틸리티 (예 : grep 또는 find)를 사용하여 .obj 및 .lib 파일 에서이 문자열을 검색 할 수 있습니다. 이렇게하면 어떤 라이브러리가 기호를 참조하는지 알게 될 것입니다.

당신이 사용할 수있는 "의존성 워커" - 애플리케이션의 종속성을 찾아 응용 프로그램이 Libcmtd에 어떻게 연결되는지 알아내는 무료 도구.편집하다: 물론 링크에 실패하지 않는 새 버전에서 사용할 수는 없지만 (주석 참조) 이전 버전 또는 새 버전이 연결하는 알려진 라이브러리에서 사용할 수 있습니다.

그러나 실제 문제는 내가 제안한 것과 관련이 없으므로 질문은 폐쇄되어야합니다.

새로운 컴파일러 및 CRT 버전과 함께 오래된 구축 라이브러리를 사용하고 있기 때문에 다른 버전의 CRT에 연결하는 것처럼 보입니다.

defaultLib "libcmtd"는 다른 libs의 사용과 충돌합니다. 귀하의 프로그램이 하나 이상의 라이브러리와 다른 버전의 Run Time 라이브러리를 사용한다는 경고입니다. 프로그램과 라이브러리에서 동일한 런타임을 사용하여 경고를 제거하십시오.

(프로젝트 설정) (C ++ 탭) 카테고리 (코드 생성) (런타임 라이브러리 사용)

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