문제

여러 프로젝트가있는 솔루션이 있습니다. 메뉴 역할을하는 "메인"프로젝트가 있으며 사용자는 다른 프로젝트에 액세스 할 수 있습니다. 이 주요 프로젝트에서는 모든 기능에 대한 링커 오류가 발생합니다. 이 링커 오류를 피하려면 어떻게해야합니까? "프로젝트 종속성 ..."대화 상자에서 이미 프로젝트 종속성을 설정했습니다.

감사

편집 - 제안대로 수행하고 출력 폴더를 링커의 추가 디렉토리에 추가했습니다. 그러나 이제 다음과 같이 백만 오류가 발생합니다.

3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ios >::setstate(int,bool)" (?setstate@?$basic_ios@DU?$char_traits@D@std@@@std@@QAEXH_N@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(int)" (?width@ios_base@std@@QAEHH@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputn(char const *,int)" (?sputn@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHPBDH@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static bool __cdecl std::char_traits::eq_int_type(int const &,int const &)" (?eq_int_type@?$char_traits@D@std@@SA_NABH0@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static int __cdecl std::char_traits::eof(void)" (?eof@?$char_traits@D@std@@SAHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::basic_streambuf >::sputc(char)" (?sputc@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEHD@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_streambuf > * __thiscall std::basic_ios >::rdbuf(void)const " (?rdbuf@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_streambuf@DU?$char_traits@D@std@@@2@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: char __thiscall std::basic_ios >::fill(void)const " (?fill@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEDXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::flags(void)const " (?flags@ios_base@std@@QBEHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: int __thiscall std::ios_base::width(void)const " (?width@ios_base@std@@QBEHXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: static unsigned int __cdecl std::char_traits::length(char const *)" (?length@?$char_traits@D@std@@SAIPBD@Z) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_ostream > & __thiscall std::basic_ostream >::flush(void)" (?flush@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEAAV12@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::basic_ostream > * __thiscall std::basic_ios >::tie(void)const " (?tie@?$basic_ios@DU?$char_traits@D@std@@@std@@QBEPAV?$basic_ostream@DU?$char_traits@D@std@@@2@XZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: bool __thiscall std::ios_base::good(void)const " (?good@ios_base@std@@QBE_NXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_ostream >::_Osfx(void)" (?_Osfx@?$basic_ostream@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Lock(void)" (?_Lock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: void __thiscall std::basic_streambuf >::_Unlock(void)" (?_Unlock@?$basic_streambuf@DU?$char_traits@D@std@@@std@@QAEXXZ) already defined in panels.lib(panel_main.obj)
3>msvcprtd.lib(MSVCP90D.dll) : error LNK2005: "public: class std::locale::facet * __thiscall std::locale::facet::_Decref(void)" (?_Decref@facet@locale@std@@QAEPAV123@XZ) already defined in panels.lib(panel_main.obj)
3>libcpmtd.lib(ios.obj) : error LNK2005: "private: static void __cdecl std::ios_base::_Ios_base_dtor(class std::ios_base *)" (?_Ios_base_dtor@ios_base@std@@CAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(ios.obj) : error LNK2005: "public: static void __cdecl std::ios_base::_Addstd(class std::ios_base *)" (?_Addstd@ios_base@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "void __cdecl _AtModuleExit(void (__cdecl*)(void))" (?_AtModuleExit@@YAXP6AXXZ@Z) already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: __Fac_tidy already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static void __cdecl std::locale::facet::facet_Register(class std::locale::facet *)" (?facet_Register@facet@locale@std@@CAXPAV123@@Z) already defined in msvcprtd.lib(locale0_implib.obj)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Getgloballocale(void)" (?_Getgloballocale@locale@std@@CAPAV_Locimp@12@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "private: static class std::locale::_Locimp * __cdecl std::locale::_Init(void)" (?_Init@locale@std@@CAPAV_Locimp@12@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_ctor(class std::_Locinfo *,class std::basic_string,class std::allocator > const &)" (?_Locinfo_ctor@_Locinfo@std@@SAXPAV12@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@2@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(locale0.obj) : error LNK2005: "public: static void __cdecl std::_Locinfo::_Locinfo_dtor(class std::_Locinfo *)" (?_Locinfo_dtor@_Locinfo@std@@SAXPAV12@@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::_Lockit(int)" (??0_Lockit@std@@QAE@H@Z) already defined in msvcprtd.lib(MSVCP90D.dll)
3>libcpmtd.lib(xlock.obj) : error LNK2005: "public: __thiscall std::_Lockit::~_Lockit(void)" (??1_Lockit@std@@QAE@XZ) already defined in msvcprtd.lib(MSVCP90D.dll)
도움이 되었습니까?

해결책

솔루션에 대한 다른 세부 사항을 알지 못하면 말하기는 어렵지만 모두 재건하는 것이 도움이 될 수 있습니다. 이 상황은 다른 아키텍처에 대한 혼합 객체 파일이있을 때 때때로 발생할 수 있습니다.

"종속성"대신 "참조"사용을 고려할 수도 있습니다.

편집하다:

당신이 게시 한 후에는 표준 라이브러리와의 연결이 일관되지 않은 것 같습니다. 프로젝트 중 하나가 표준 라이브러리를 정적으로 연결하는 반면 다른 프로젝트가 동적으로 연결되어있을 수 있습니까? (프로젝트 속성-> 링커 참조) 또는 하나는 릴리스 런타임까지, 다른 하나는 디버그를하기 위해? (마지막 것은 가능하지만 경고로 가능해야합니다)

다른 팁

솔루션에 대한 모든 세부 사항을 모르면 대답하기는 어렵지만 "기타"프로젝트가 .lib 파일을 생성하도록 설정되었다고 가정하고 기본 프로젝트는 이러한 모든 LIB 파일을 연결합니다. 이 경우 발생하는 오류에 대한 가능한 원인은 프로젝트가 다른 버전의 런타임 라이브러리에 연결되기 때문입니다.

에서 Microsoft의 문서, "링커의 주어진 호출로 전달 된 모든 모듈은 동일한 런 타임 라이브러리 컴파일러 옵션 ( /md, /mt, /ld)으로 컴파일되어야합니다."

동일한 버전의 런타임 라이브러리를 사용하도록 모든 프로젝트를 변경하십시오. Visual Studio 2010에서 이것은 프로젝트의 속성에 있습니다 | 구성 속성 | C/C ++ | 코드 생성 | 런타임 라이브러리. 어느 쪽이든 선택하십시오 멀티 스레드 디버그 DLL 또는 멀티 스레드 디버그 (디버그 구성의 경우).

다른 프로젝트의 기능이 수출됩니까? 그들이 내보내지 않으면 메인 엑스에서 링크 할 것이 없으므로 오류가 발생합니다. 보다 __declSpec (내보내기)를 사용하여 DLL에서 내보내기 자세한 내용은.

당신이 얻는 오류는 'error lnk2005'입니다. 여기서 당신이 연결하는 라이브러리의 기호 (msvcprtd.lib)는 이미 다른 라이브러리 (예 : panels.lib)에서 정의되었습니다. '특정 라이브러리 무시'필드에 panels.lib를 추가하면 (vs2008 구성 속성-> 링커-> 입력-> 특정 라이브러리 무시) 오류가 중지됩니다.

나는 당신이 얻는 링커 오류가 "해결되지 않은 기호"에 대한 것이라고 생각합니까?

정적 라이브러리 (예 : .lib 파일)를 사용하는 경우 링커 입력에 라이브러리를 추가하여 링키지 시간에 기호를 연결할 수 있습니다. 이 작업을 수행하지 않으면 해결되지 않은 상징이 나타납니다.

  1. 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 속성을 선택하십시오.
  2. 구성 속성-> 링커-> 입력을 선택하십시오
  3. 추가 종속성에서 라이브러리 이름 (예 : filename.lib)을 입력하십시오.

내 라이브러리 중 하나가 '내장 유형으로 취급'옵션이 있었기 때문에이 문제와 매우 비슷한 문제가있었습니다. 이 설정은 새 프로젝트에서 기본적으로 거짓입니다. 그것들을 모두 바로 변경하면 문제가 해결되었습니다.

정확히, 귀하의 프로젝트 중 적어도 하나는 다른 "런타임 라이브러리"와 다른 프로젝트와 함께 컴파일됩니다. 어쩌면 다른 기본값을 사용하여 새로운 것을 추가했을 수도 있습니다. "구성 속성" -> "C/C ++" -> "Code Generation" -> "런타임 라이브러리"의 동일한 값에 대해 프로젝트의 속성을 확인하십시오.

필자의 경우 문제는 기능 프로토 타입, 클래스 정의 및 기능 구현 및 클래스 구현을 단일 CPP 파일로 유지했기 때문입니다. 선언과 프로토 타입을 별도의 헤더 파일로 전환했을 때만 이러한 오류가 사라졌습니다. 정말 이상해!

제 경우에는 두 가지 방법이 있습니다.

  1. 프로젝트 속성 -> C/C ++ -> 코드 생성 -> 런타임 라이브러리. Mt로 변경하십시오.

  2. 부족 라이브러리를 다음에 추가하십시오. 링커 -> 입력 -> 추가 종속성. 작동하지 않으면 라이브러리 이름 대신 전체 경로를 추가하십시오.

예를 들면 다음과 같습니다.

그것은 나를 위해 효과가 있습니다. 다른 사람을 위해이 질문은 도움이 필요합니다.

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