2012-09-05 2 views
0

여러 Visual Studio 프로젝트가있는 매우 큰 프로젝트에서 작업하고 있습니다. 이 프로젝트는 정적 라이브러리로 빌드되어 Main 프로젝트에 포함되어 있습니다. Main.exe이라고 부릅니다.두 개의 정적 라이브러리에 대한 링크

나는 새 프로젝트를 만들고 정적 라이브러리로 만들었으니, MyProj.lib이라고 부르 자. 이 라이브러리는 다른 정적 라이브러리에 종속적이므로 API.lib으로 호출 해 보겠습니다.

이제 프로젝트를 메인 프로젝트에 연결해야합니다. 현재 저는 두 개의 정적 라이브러리를 Main 프로젝트에 링크했습니다. 이전에이 질문을했습니다 : Link static library in another static library 및 정적 라이브러리를 중첩 할 수 없다는 것을 알게되었습니다. Paul Michalik은 Main 프로젝트를 만들 때 두 라이브러리를 독립적으로 연결해야한다고 지적했습니다.

이제 라이브러리에서 라이브러리에 정의 된 기호를 찾을 수 없다는 의미에서 여러 개의 LNK2019 오류가 발생합니다. Visual Studio는 두 라이브러리 파일 모두를 알고 있으므로 매우 혼란 스럽습니다. 어떤 아이디어?

답변

2

이런 종류의 혼동은 .lib 파일이 어떻게 든 마술적인 것이라고 믿는 데서 비롯됩니다. 링커가 일 수 있습니다. .lib 파일에 다른 종속성이 있음을 참조하십시오. 그것은 사실이 아닙니다. 정적 .lib는 .obj 파일의 모음입니다. 컴파일러 출력을 단일 파일로 수집하는 방법. 아무것도 더, 아무것도 덜.

라이브러리를 빌드하면 누락 된 종속성에 대해 절대로 불평하지 않습니다. 특히 혼란스러운 점은 무엇입니까? 라이브러리에 대한 설명은 간단합니다. 이 아니고 링커를 실행하십시오. .obj 파일을 가방에 모으는 lib.exe 도구.

최종 실행 파일을 빌드하기 위해 실제로 링커를 실행할 때까지는 함께 작동하지 않습니다. 이제 모든 조각이 함께 있어야합니다. 링커 에는이 있으며 종속성이 포함 된 .obj 또는 .lib 파일도 있습니다. 그렇지 않을 때 불평을합니다.

C/C++ 빌드 모델에서 매우 약한 링크로 수정하기가 어렵습니다. 공급 업체는이 문제를 해결하려고 노력했지만 Microsoft도 그렇게했습니다. 그들은 링커의 추가 종속성 설정에서 명시 적으로 지정하지 않고 "something.iib"를 링크해야한다고 링커에 알리기 위해 비표준 #pragma comment (lib, "something.lib") 기능을 추가했습니다. 아주 좋아. 정확하게 을 다루는 경우, "something.lib"이 저장되어있는 것은 문제가됩니다. Crud. 또 다른 설정.

1

가장 쉬운 해결책은 단순히 .lib 파일을 사용하는 각 프로젝트에 파일을 추가하는 것입니다. 문제가되는 경우 (대개 VS에 해당하지 않음) 종속 라이브러리에 의존 라이브러리를 배치합니다.

이 단점은 라이브러리가 변경 될 때 자동으로 다시 컴파일되지 않는다는 것입니다.

+0

메인 프로젝트에서'API.lib' 링크와'MyProj.lib' 링크를 연결하고 링크하고 있습니까? 나는 그것을 시도했고 약 3600 + 링커 경고를 준다. – Derek

+0

@Derek : MyProj.lib *에 * API.lib가 포함되어 있으면 이런 일이 발생합니다. 그러나 MyProj는 API에 대한 외부 참조와 참조 된 모듈 및 기호가 아닌 다른 요소 만 포함해야합니다. – wallyk

+0

좋아, 내가 너를 따라 다니는 것 같아. 현재'MyProj.lib'는'API.lib'에 링크하지 않고 라이브러리로 빌드되고 있습니다. – Derek

관련 문제