sourcetip

-I dir vs. -I system dir

fileupload 2023. 6. 17. 09:38
반응형

-I dir vs. -I system dir

헤더 파일을 검색할 디렉토리를 포함하려면 어떤 방법이 선호되며 그 이유는 무엇입니까?

이것을 보는 한 가지 방법은 사용자가 제어하는 머리글을 사용하는 것입니다.-I그리고 당신이 가지고 있지 않은 것들(시스템, 제3자 립스).-isystem실질적인 차이는 경고가 활성화되었을 때 발생합니다. 경고는 다음에서 발생합니다.-isystem헤더가 억제됩니다.

-I에 대한 gcc 설명서에서:

헤더 파일을 검색할 디렉토리 목록의 머리에 디렉토리 dir를 추가합니다.이 디렉터리는 시스템 헤더 파일 디렉터리보다 먼저 검색되므로 시스템 헤더 파일을 재정의하여 사용자의 버전을 대체할 수 있습니다.그러나 공급업체에서 제공한 시스템 헤더 파일이 포함된 디렉터리를 추가하려면 이 옵션을 사용하지 마십시오(이 옵션에는 -issystem 사용).두 개 이상의 -I 옵션을 사용하는 경우 디렉토리가 왼쪽에서 오른쪽 순서로 검색되고 표준 시스템 디렉토리가 그 다음에 검색됩니다.

표준 시스템에 디렉터리가 포함되어 있거나 -issystem으로 지정된 디렉터리도 -I로 지정된 경우 -I 옵션은 무시됩니다.디렉터리는 계속 검색되지만 시스템의 정상 위치에 있는 시스템 디렉터리에는 체인이 포함됩니다.이는 버그 시스템 헤더를 수정하는 GCC의 절차와 include_next 디렉티브의 순서가 실수로 변경되지 않도록 하기 위한 것입니다.시스템 디렉토리에 대한 검색 순서를 변경해야 하는 경우 -nostdinc 및/또는 -isystem 옵션을 사용합니다.

그렇게-I공급업체에서 제공하는 시스템 헤더와 같은 특수한 경우를 제외하고는 헤더 파일의 위치를 지정하는 것이 좋습니다.

-I를 사용하여 헤더의 위치를 지정해야 합니다.

-issystem으로 지정한 파일은 -I가 처리된 후 검색되며 gcc(표준 시스템 헤더와 동일)로 특별 처리됩니다.

그래서 몇 가지 실험을 통해 제가 발견한 차이점이 있습니다.다음과 같은 설정을 상상해 보십시오.

my_std_lib/stdio.h

#ifndef _CUSTOM_STDIO_H

void test() {}

#endif

#include_next <stdio.h>
#include_next <custom.h>

my_user_lib/custom.h

#ifndef _CUSTOM_HEADER_H

void custom_func() {}

#endif

main.cpp

#include "stdio.h"

int main() {
  test();
  custom_func();
  printf("Hello world!");
  return 0;
}

다음을 사용하여 컴파일하는 경우g++ -isystem my_std_lib -isystem my_user_lib main.cpp모든 게 정상으로 작동할 겁니다.

하지만,g++ -isystem my_std_lib -I my_user_lib main.cpp오류가 발생합니다.

In file included from main.cpp:1:
my_std_lib/stdio.h:10:15: fatal error: 'custom.h' file not found
#include_next <custom.h>
              ^~~~~~~~~~
1 error generated.

그래서 무슨 일입니까?

내가 이해하기로는, 내가 글을 쓸 때.#include "stdio.h"는 GCC를 찾을 때까지 합니다.my_std_lib/stdio.h#include_next <custom.h>▁a▁at다▁the▁to▁search를 검색하라고 합니다.custom.h포함 디렉터리를 현재 위치에서 이후로 이동합니다.

가 때할가추를 할 때.my_user_lib다을사여목로록으를 사용하여 디렉토리 합니다.-I플래그, 디렉터리 목록의 모든 시스템 디렉터리 앞에 나타납니다.따라서 이전 목록에 표시됩니다.my_std_lib 및 이름#include_next실패합니다.

다음을 사용하여 컴파일할 경우에도 동일한 현상이 발생합니다.g++ -isystem my_user_lib -isystem my_std_lib main.cpp목록에 플래그가 지정된 순서와 동일한 순서로 디렉토리가 추가된 것으로 보입니다.my_user_lib앞에올 앞에 올 입니다.my_std_lib.

간히말해서단,서▁so해말히▁a.-I그리고.-isystem포함 디렉터리 목록에 대상을 추가하는 방식이 다릅니다.

머리글 "Myheader"를 포함하는 경우.h" -I를 사용하여 컴파일러는 "Myheader"라는 검색 순서를 생성합니다.h", "시스템/펌웨어".그래서 만약 "마이헤더"에서 무언가를 찾을 수 없다면요.h" "시스템/하드웨어"에 의존합니다.그러나 -is 시스템을 사용할 때 기본적으로 "시스템/헤더"를 제가 제공하는 것으로 바꾸라고 말하는 것입니다.따라서 더 이상 "시스템/헤더"에 의존하지 않습니다.

언급URL : https://stackoverflow.com/questions/2579576/i-dir-vs-isystem-dir

반응형