2009-06-24 3 views
6

방지하는 방법 :C에서 "이미 정의 오류"++ 응용 프로그램에 연결하는 동안은 MFC VS6 프로젝트에 gettings에게 오류의 이러한 유형을 오전

msvcrt.lib(MSVCRT.dll) : error LNK2005: _atoi already defined in LIBC.lib(atox.obj) 

나는 그것이 무엇을 의미하는지 알고 (함수가 2 개의 다른 라이브러리에 존재를); 이를 해결하기 위해서는 2 개의 라이브러리 (msvcrt.lib 또는 libc.lib) 중 하나를 제외해야합니다.

하지만 이렇게하면 모든 종류의 해결되지 않은 외부 오류가 있습니다. 그래서 두 라이브러리를 계속 사용하고 싶습니다.

_atoi 함수를 libc.lib에 사용하고 msvcrt.lib (또는 그 반대로)을 사용하지 않는다고 링커에 알리는 방법이 있습니까?

어떤 도움이나 지침이 좋을 것입니다.

답변

1

프로젝트 설정> 링크> '파일 출력 강제 실행'에서 다음과 같은 오류를 무시하는 데 사용할 수있는 옵션이있는 것 같습니다. 이렇게하면 링커 오류가 있어도 프로그램이 생성됩니다.

다음 msvcrt.lib (의 MSVCRT.dll) : 경고 LNK4006 :

빌드 출력은 다음과 같이 제공합니다 이미 LIBC.LIB (atox.obj)에 정의 된 _atoi을;

물론이 옵션을 사용하면 어떤 경우에는 작동하지 않는 응용 프로그램을 생성 할 수 있으므로주의해야하지만 여기서는 아무런 해를 끼치 지 않을 수 있습니다.

다른 답장을 보내 주셔서 감사합니다. 그러나 특정 경우에는 옵션이 아닌 것으로 보입니다.

11

이 오류는 확실히 고유 한 런타임 라이브러리를 사용하여 컴파일 된 두 개의 코드를 연결하고 있음을 의미합니다. LIBC.lib는 정적 버전이지만 MSVCRT.dll은 동적 버전입니다. 이렇게하면 모든 지옥이 느슨해집니다. 코드의 어느 부분에서 어떤 버전을 사용하는지 알아 내고이를 찾아보십시오.

+1

나는 관리되지 않는 세계에 익숙하지 않았기 때문에 비슷한 문제가있었습니다. 제게는 런타임 라이브러리와 코드 라이브러리에 따라 다른 버전의 타사 라이브러리가 필요할 수도 있습니다. 용도. 타사 라이브러리를 다운로드하고 VC++ 2005 프로젝트와 링크하려고했습니다. 사용 된 라이브러리와 이전 버전의 (a?) 런타임 라이브러리 -LIBCP.LIB가 사용되었습니다. 다행히도 제 3 자 라이브러리는 소스를 사용할 수 있었기 때문에 VC2005 런타임 라이브러리를 사용하여이를 완성 할 수있었습니다. 소스없이 이것을 해결할 수 있을지 궁금합니다. – axk

4

런타임 충돌이 있습니다. 여러 런타임 라이브러리를 사용하는 것은 일반적으로 나쁜 일입니다.

링커 옵션에서/nodefaultlib : msvcrt (또는/nodefaultlib : libc)를 사용하여 둘 중 하나를 제외 할 수 있습니다.

사실,이를 사용하기 전에 프로젝트 설정을 확인하십시오. 올바르게 기억한다면 libc는 VS6의 단일 스레드 런타임이고 msvcrt는 다중 스레드 런타임입니다. 솔루션에 여러 프로젝트가있는 경우 모두 하나 또는 다른 프로젝트를 사용하고 있는지 확인하십시오.

+1

libc는 단일 스레드 정적입니다. libcmt는 멀티 스레드 정적입니다. msvcrt는 DLL이며 멀티 스레드입니다. libc는 현재 MSVC 릴리스에서 더 이상 사용할 수 없습니다. – MSalters