2011-03-02 4 views
12

다른 이름으로 같은 이름을 가진 파일을 추가 포함 디렉토리의 다른 폴더에 포함시키는 가장 좋은 방법은 무엇입니까?라이브러리에 동일한 헤더 이름이 포함 된 경로가 포함됩니다.

예 : 두 LIB1가/포함 LIB2/추가에 추가 포함

lib1/include/foo.h 
lib2/include/foo.h

디렉토리를 포함한다.

편집 :

libs와 다른 SDK의 출신과 모든 개발자가 자신의 장소에 설치합니다.

#include "../../lib1/include/foo.h

는 방법 2 :

것은/LIB1 추가 LIB2 전에 포함/검색 경로에와 있기 때문에 포함 확실한 한가지는 두 폴더는 IDE의 추가에 있는지가 경로

방법 1이 (가)

#include "foo.h"

리 : 그들은 함께 순서대로 검색됩니다 B1/포함/foo.h는

+1

방법이 아니라에서 (디렉토리 순서를 포함) 코드 자체. 누군가가 프로젝트 설정을 재구성해야한다면,이 문제가 심지어 적절한 설정보다 훨씬 적다는 것을 분명히 알 수 없습니다. –

+0

@ 마이크 이러한 방법이 최선의 방법은 아니라는 것을 알고 있지만, 지금 내가 생각하고있는 유일한 방법입니다. 나는이 방법들 중 어느 것도 좋아하지 않기 때문에 여기서는 더 나은 방법을 묻습니다. – Felics

답변

4

먼저이 대답은 두 헤더의 포함 가드가 호환 가능하다고 가정합니다 (즉, 동일한 기호가 아님).

당신이 할 수있는 한 가지는 링크 파일을 고유 한 이름으로 지정하여 알려진 헤더 파일의 알려진 위치에 링크를 만드는 것입니다. 예를 들어 두 라이브러리가 $ LIB1PATH 및 $ LIB2PATH에 설치되어 있고 다른 빌드 환경에서 값이 다를 수 있다고 가정 해보십시오. 따라서 얻고 자하는 헤더는 $ LIB1PATH/include/foo.h와 $ LIB2PATH/include/foo.h에 있습니다.

두 가지 방법을 사용할 수 있습니다. 하나는 직접 링크를 만드는 것입니다. 이 프로젝트의 디렉토리 트리에 다음과 같이 수 :

$PROJDIR/ 
    include/ 
    lib_include/ 
     lib1_foo.h -> $LIB1PATH/include/foo.h 
     lib2_foo.h -> $LIB2PATH/include/foo.h 
    src/ 

코드가 저장소에있는 경우 당신이이 링크를 확인 할 수 없기 때문에 이것은, 까다로운 얻을 수; 그들은 다른 환경에서 잘못 될 것입니다. 또한 링크가 많고 라이브러리가 거의 없다면 lib1 또는 lib2가 움직일 때마다 모든 라이브러리를 다시 만들어야합니다. 당신은 프로젝트의 디렉토리를 포함하는 디렉토리에 링크를 만들어이 문제를 해결 얻을 수 있습니다 : 두 경우 모두

$PROJDIR/ 
    include/ 
    lib_include/ 
     lib1_foo.h -> ../../lib1/include/foo.h 
     lib2_foo.h -> ../../lib2/include/foo.h 
    src/ 
lib1 -> $LIB1PATH/ 
lib2 -> $LIB2PATH/ 

을, 당신은 $PROJDIR/lib_include 당신이 경로를 포함에 있는지 확인해야합니다. 또한 두 개의 foo.h 헤더가 해당 디렉토리에서 더 많은 헤더를 가져 오는 경우 포함 경로에 $LIB1PATH/include$LIB2PATH/include 만 있으면됩니다. 당신은 또한 include에있는 연결을두고 lib_include를 제거 할 수 있었다, 그러나 나는이 것을 분리되는 유지하고 싶다.

5

당신은 그냥이 할 수있는 포함됩니다 :

#include "lib1/include/foo.h" 
#include "lib2/include/foo.h" 

을 모두 lib1lib2의 부모 디렉토리가 포함에 대한 귀하의 검색 경로에 (그러나 하지 있는지 확인을 실제 서브 디렉토리 include). 두 헤더가 포함 가드와 같은 기호를 사용하는 경우

참고이 메서드는 작동하지 않습니다 - 두 포함 사이에 충돌하는 기호를 정의를 해제해야합니다 :

#include "lib1/include/foo.h" 
#undef FOO_H 
#include "lib2/include/foo.h" 
+0

libs는 다른 SDK의 것이며 모든 개발자는 자신의 위치에 설치합니다. 확실한 것은 두 폴더가 IDE의 추가 경로에 포함되어 있다는 것입니다. – Felics

+0

@Felics : 그래서 당신은'#include "foo.h"'를 피해야 만합니다. SDK가 설치되어있는 디렉토리의 이름 (이 예에서는'lib1'과'lib2')이 확실하지 않습니까? 그렇다면 유일한 해결책은 두 개의 헤더 파일에 다른 이름의 링크를 만들고 해당 링크를 사용하여 헤더에 도달하는 것입니다. 심지어 가드 문제 eznme 언급 포함 때문에 작동하지 않을 수도 있습니다. –

+0

왜 익명 다운 투표입니까? 유권자가 유효한 비판을하는 경우에는 언제든지 무료로 응답 해 주시면 기꺼이 답변을 수정하거나 적절히 삭제하겠습니다. –

7
#include "lib1/include/foo.h" 
#include "lib2/include/foo.h" 

가 미세인가 이 헤더에 대한 실제 상대 경로이므로 포함 보호 장치이 다릅니다. 예를 들어, 두 foo.h는 (그것은 단지 하나, 둘을 포함하는 한 것은 실행 순서에 따라 결정됩니다)

#ifndef _foo_h_ 

다음이 당신에게 당신이 원하는 그나마 뭔가를 줄 것이다 사용하는 경우.

#include "lib1/include/foo.h" 
#include "lib2/include/foo.h" 

따라서 모호성 때문에이 없을 것 :

+0

+1 : 포함 경비원에 대한 좋은 지적! –

+0

대단히 감사합니다. 검색 경로에 대한 좋은 점! –

1

나는 (그 LIB1 및 LIB2를 포함하는 디렉토리의 경로를 말을하는 것입니다)를 -I 목록에있는 명확한 디렉토리에서 파일을 포함 할 것 프리 D 파일러는 해당 디렉토리 목록에서 lib1/include/foo.h을 볼 것이고 lib1/include/ 또는 lib2/include/에서 발생하지 않지만 상위 디렉토리에서만 발생합니다.

앞서 말했듯이, 가드 (guard)와 조심해야합니다. lib 헤더의 경우에도 이러한 혼란을 피하기 위해 lib 이름을 포함시켜야합니다.

4

현재 4 답변과 1709 건의 의견으로는 아직 누구도 그렇게 쉽지 않고 솔직한 해결책을 제시하지 못했습니다.

파일을 원하는대로 포함 할 수 있습니다. 발생할 수있는 유일한 실제 문제는 거의 동일한 가드 헤더입니다. 따라서 충돌하는 헤더 파일을 모두 포함하는 헤더를 만들어야합니다. inc_foo_lib1_lib2.h이라고합시다. 이 파일에는 첫 번째 foo.h을 포함하고, 가드 헤더가 정의되지 않은 것으로 정의 된 경우 두 번째로 foo.h을 포함합니다.

예로 foo.h은 헤더 가드 FOO_H_INCLUDED을 가지고 가정, 다음 inc_foo_lib1_lib2.h이의 모습 : 프로그램 컴파일 설정에 의존하기 때문에이 나쁜

#include "lib1/foo.h" 
#ifdef FOO_H_INCLUDED 
#undef FOO_H_INCLUDED 
#else 
COMPILATION ERROR — the header guard was changed! 
#endif //FOO_H_INCLUDED 
#include "lib2/foo.h" 
관련 문제