2012-07-10 5 views
3

정적 라이브러리를 처음 사용하고 각각 고유 한 코드와 일부 공유 코드가있는 2 (+) 라이브러리를 만들고 싶습니다. 내 의도는 다른 프로젝트가 하나 이상의 정적 라이브러리를 연결한다는 것입니다.중복 된 심볼 오류없이 정적 라이브러리에서 코드를 공유하려면 어떻게합니까?

Util.h/m <-- Shared 
ImplOne.h/m <-- Unique to 'ImplOne' 
ImplTwo.h/m <-- Unique to 'ImplTwo' 

내가 엑스 코드를 사용하여 하나의 경우 Util.mImplOne.m를 구축하여 라이브러리를 생성하고, 기타의 Util.mImplTwo.m하고있다.

물론 중복 된 기호가 있기 때문에 지금은이 라이브러리를 함께 사용할 수 없다는 것이 문제입니다. 이 상황에서 더 나은 아키텍처는 무엇입니까?

+0

implone과 impltwo로 util을 공유하는 세 개의 라이브러리로 만듭니다. – dasblinkenlight

+0

@ dasblinkenlight 그 생각과 그것이 작동합니다 ... 그것은 유일한 방법입니까? 아마도 그럴 것입니다. –

+0

이것은 아마도 가장 깨끗한 대안 일 수 있습니다. 매크로를 사용하여 함수 및 변수의 이름을 변경할 수 있지만 그 결과는보기 흉하게 들릴 것입니다. – dasblinkenlight

답변

3

가장 깨끗한 대안은 공유 된 Utils.h/m에 대해 별도의 라이브러리를 만드는 것이라고 생각합니다. 단점은 사용자가 implone 및/또는 impltwo과 함께 utils을 연결해야하고 impooneimpltwo을 연결하려면 두 라이브러리를 동일한 버전의 utils으로 컴파일해야한다는 것입니다. 그 대가로 도서관의 근원은 훌륭하고 깨끗하게 유지 될 것입니다.

매크로를 사용하여 utils의 함수 및 변수 이름을 변경하여 링커 오류를 방지 할 수 있습니다. 가장 중요한 결과는 코드 중복입니다. imploneimpltwo은 동일한 코드를 다른 이름으로 연결합니다. 다른 하나는 가독성입니다. 함수에 대한 각각의 참조가 utils에 매크로로 래핑되어야하기 때문에 엄청난 고통을 겪을 것입니다. 이것은 두 번째 방법을 더럽 힙니다. 따라서 utils을 별도의 라이브러리로 만드는 것이 좋습니다.

2

현재 코드베이스에서 이와 비슷한 문제가 있습니다. 내 솔루션은 내가 작성한 답변과 유사하지만 여기서는 비교/참조로 남겨 두겠습니다.

공통 정적 라이브러리 프로젝트가 있습니다 (libCommonBits.a라고 부름). libCommonBits.a에 의존하는 libCommonUI.a라고 부르는 몇 가지 UI 코드가있는 두 번째 정적 라이브러리가 있습니다. 내 주요 애플 리케이션은 두 라이브러리를 사용해야합니다.

제 해결책은 실제로 libCommonBits.a를 libCommonUI.a에 연결하지 않는 것입니다. 그것은 헤더 파일에 대해 잘 컴파일하고, 그냥 내 정적 라이브러리 대신 정적 라이브러리에 대한 내 주요 애플 리케이션 링크를 의미합니다.

나는이 접근법이 더 많은 사람들이 도서관을 배포함으로써 이루어지고 있기를 바라고 있습니다. 공용 라이브러리 (JSONKit 또는 유사)에 이미 링크되어있는 정적 라이브러리를 사용할 때 좌절감을 느낄 수 있으며이를 코드베이스에서 별도로 사용할 수도 있습니다. 이 경우 심볼 이름 변경 만이 유일한 해결책 일 수 있습니다.

+0

+1은 공동 도서관에서 연결하지 말 것을 상기시키기위한 것입니다. –

관련 문제