어떤 unistd.h 파일이 로드되었는지 어떻게 알 수 있나요?

어떤 unistd.h 파일이 로드되었는지 어떻게 알 수 있나요?

unistd.h내 Ubuntu Linux에는 여러 파일이 있습니다. /usr/include/asm/unistd.h파일에는 다음 지시문이 있습니다 .

# ifdef __i386__
#  include "unistd_32.h"
# else
#  include "unistd_64.h"
# endif

unistd_32.h해당 폴더에서 이러한 파일( 및 ) 을 찾을 수 있습니다 unistd_64.h.

하지만 이 지시문으로 시작하는 /usr/src/linux-headers-2.6.31-22/include/asm-generic/또 다른 지시문이 있습니다 .unistd.h

#if !defined(_ASM_GENERIC_UNISTD_H) || defined(__SYSCALL)
#define _ASM_GENERIC_UNISTD_H

그래서 질문은: 어느 것이 로드되었는지 어떻게 알 수 있습니까? Java를 사용하여 런타임에 이를 확인할 수 있는 방법이 있습니까?

답변1

포함 파일을 찾기 위해 컴파일러가 따르는 정확한 규칙은 gcc아래에 설명되어 있습니다.http://gcc.gnu.org/onlinedocs/cpp/Search-Path.html

포함 파일의 출처를 알아내는 빠른 명령줄 요령: 1

echo '#include <unistd.h>' | gcc -E -x c - > unistd.preprocessed

그런 다음 파일을 보면 다음 unistd.preprocessed과 같은 줄을 볼 수 있습니다.

# 1 "/usr/include/unistd.h" <some numbers>

이는 다음 라인 블록(다음 # number ...라인까지)이 file 에서 온 것임을 알려줍니다 /usr/include/unistd.h.

따라서 포함된 파일의 전체 목록을 알고 싶다면 다음 # number줄을 grep하면 됩니다.

echo '#include <unistd.h>' | gcc -E -x c - | egrep '# [0-9]+ ' | awk '{print $3;}' | sort -u*emphasized text*

내 Ubuntu 10.04/gcc 4.4.3 시스템에서는 다음이 생성됩니다.

$ echo '#include <unistd.h>' | gcc -E -x c - | egrep '# [0-9]+ ' | awk '{print $3;}' | sort -u
"<built-in>"
"<command-line>"
"<stdin>"
"/usr/include/bits/confname.h"
"/usr/include/bits/posix_opt.h"
"/usr/include/bits/predefs.h"
"/usr/include/bits/types.h"
"/usr/include/bits/typesizes.h"
"/usr/include/bits/wordsize.h"
"/usr/include/features.h"
"/usr/include/getopt.h"
"/usr/include/gnu/stubs-64.h"
"/usr/include/gnu/stubs.h"
"/usr/include/sys/cdefs.h"
"/usr/include/unistd.h"
"/usr/lib/gcc/x86_64-linux-gnu/4.4.3/include/stddef.h"

1 노트:-I포함 파일의 검색 경로는 명령줄 옵션을 통해 수정되므로 호출 -I path 에 인수를 추가 해야 합니다 gcc. 또한 C++ 소스 코드를 컴파일하는 경우 -x c를 로 바꿔야 합니다 -x c++.

관련 정보