2014-10-07 3 views
0

두 가지 버전의 정적 라이브러리를 사용하는 Xcode (6.0.1)에서 프로젝트를 만들려고합니다. 실행 파일이 다른 반면, 유사하다 두 디렉토리에 foo.h 및 bar.hXcode : 정적 라이브러리의 여러 버전

+ include 
    |-- VersionA 
     |-- foo.h 
     |-- bar.h 
    |-- VersionB 
     |-- foo.h 
     |-- bar.h 

+ lib 
    |-- VersionA 
     |-- foo.a 
     |-- bar.a 
    |-- VersionB 
     |-- foo.a 
     |-- bar.a 

헤더 : 그러므로 나는이와 비슷한 디렉토리 구조를 만들었습니다.

#include "VersionA/foo.h" // or this: 
#include "VersionB/bar.h" 

이제 질문 : 특정 헤더를 포함하기 위해, I (비 재귀)가 검색 ​​경로 같이 포함에 include 디렉토리를 추가 엑스 코드는 (어떤 마하 - O 지방을 결정 않는 방법. a) 특정 헤더 파일을 링크 할 파일? 이 할당은 어떻게 작동하며 어떻게 영향을 미칠 수 있습니까?

편집 : 링커가 모두 LIB 디렉토리로 보이지만

내가 오류를 연결 중복 기호를 얻을. 헤더 파일에

#ifndef FOO_H 
#define FOO_H 
... 

과 같은 가드가 포함되어 있으므로 재정의와 관련하여 오류가 발생하지 않습니다. 내가 하나가 경비를 포함 변경할 경우 즉

#ifndef FOO_H_VERSION1

컴파일시 오류 (Sematic 문제, 'FOO_SOMETHING'의 재정이)가 있습니다. 이는 나에게 의미가 있으며 헤더 파일을 복제하는 것이 좋지 않을 수 있음을 나타냅니다.

그럼에도 불구하고, 내 프로젝트의 경우 에는 정적 라이브러리의 두 가지 버전이 필요합니다. 이것을 달성하기위한 합리적인 방법은 무엇입니까?

답변

1

헤더 파일을 포함해도 자동으로 라이브러리가 포함되거나 링크되지 않습니다. 링크하려는 라이브러리를 빌드 단계의 "라이브러리와 링크 바이너리"섹션에 표시하십시오.

귀하의 경우 모든 라이브러리를 추가하고 관련 헤더 파일을 사용해야합니다.

그러나 이들은 동일한 라이브러리의 다른 버전이라고 말했습니다. 라이브러리에 같은 이름의 메서드가 포함되어 있으면 링커에서 그에 대한 불만을 제기합니다. 이를 염두에두고, 같은 라이브러리에 대해 별도의 버전을 포함 할 필요가 있는지 여부를 재검토해야합니다. 한 라이브러리 만 사용하는 것을 방해하는 라이브러리가있는 경우 더 유용 할 수 있습니다 (궁극적으로는 스트레스가 적어서 문제를 해결할 수 있습니다.

+0

재미있는 점은 두 라이브러리 디렉토리를 연결하는 것처럼 보이지만 링커가 중복 된 심볼에 대해 불평하지 않는다는 점입니다. 하지만 헤더 파일의 내용이 동일하기 때문에 중복 파일이 있어야합니다. 맞습니까? – Simon

+0

자, 맞았 어. 한 가지 버전 만 사용하는 것이 쉬웠다. 고마워! – Simon

+0

@ Simon 기쁜 소식입니다.첫 번째 주석과 관련하여 대부분의 경우 링커는 실제로 링크를 사용하지 않는 한 링크 된 라이브러리의 함수를 찾지 않습니다. 두 라이브러리 버전간에 중복 기능이없는 별도의 기능을 사용하는 경우 아무 문제가 없습니다. 그렇지 않다면 - 그것은 이상한 일입니다 - 그것이 계속 작동하기를 바랍니다! – ttarik

0

헤더 파일은 어떤 것과도 "연결"되어 있지 않습니다. 여기 무슨 일이 일어나는가? 헤더를 통해 여러 가지 방법에 대한 약속을 한 다음 링커에게 약속 한 내용을 전달합니다. 링커의 작업 중 하나는 프로젝트에 포함 된 모든 아티팩트를 검색하여 각 메소드가 실제로 있는지 확인하는 것입니다. 누락 된 경우 누락 된 기호 오류가 발생합니다. 두 라이브러리가 같은 이름의 메소드를 정의하면 중복 된 심볼 오류가 발생합니다. 결국 그 .a 파일은 존재하지 않습니다. 모든 것이 하나의 바이너리 파일에 통합됩니다.

관련 문제