Linux 헤더 파일의 충돌을 피하는 방법은 무엇입니까?

Linux 헤더 파일의 충돌을 피하는 방법은 무엇입니까?

저는 Linux의 작동 방식과 모듈 구축 방식을 이해하려고 노력하고 있습니다.

지금까지 Linux 헤더가 에 저장되어 /usr/include있고 이러한 인터페이스의 컴파일된 구현이 에 있음 을 확인했습니다 /usr/lib/x86_64-linux-gnu. 몇 가지 질문이 있습니다.

  1. Linux나 C 프로그램은 헤더 파일과 .so 파일을 찾을 위치를 어떻게 알 수 있나요? 이것을 정의하는 파일이 있습니까? 행아웃용으로 다른 기본 소스 또는 제목 폴더를 추가하려는 경우 이러한 참조를 수정할 수 있습니까?

  2. 갈등을 피하는 방법은 무엇입니까? 예를 들어, 로 정의된 헤더 파일이 libprocps-dev있습니다 . 이 파일의 구현은 에 있습니다 . 누군가가 함수 정의는 동일하지만 다른 구현(또는 코드)을 사용하여 다른 .so 파일을 컴파일하여 에 추가하면 어떻게 될까요 ? 링커는 해당 헤더 정의에 연결되어야 하는 올바른 .so 파일이 무엇인지 어떻게 알 수 있습니까?/usr/include/proc/numa.hvoid numa_uninit (void);/usr/lib/x86_64-linux-gnu/libprocps.so/usr/lib/x86_64-linux-gnu

감사해요.

답변1

저는 Linux의 작동 방식과 모듈 구축 방식을 이해하려고 노력하고 있습니다.

커널 모듈 빌드에는 "표준" C 컴파일러 디렉토리가 포함되지 않습니다. 를 참조하십시오 /lib/modules/$(uname -r)/build.

  1. 프로그램헤더 파일과 라이브러리를 어디서 찾을지 모릅니다. C 전처리기와 컴파일러가 이를 수행합니다. 다음을 사용하여 표준 포함 디렉토리를 볼 수 있습니다.

    gcc -xc -E -v - < /dev/null
    

    (C++의 경우 -xc로 대체 -xc++), 라이브러리를 사용하여 디렉토리를 검색합니다.

    gcc -print-search-dirs
    
  2. 컴파일러는 충돌을 피하지 않습니다. 검색 경로에 충돌하는 헤더가 없는지 확인하는 것은 컴파일러를 실행하는 사람에게 달려 있습니다. 라이브러리는 자동으로 링크되지 않으므로 링커 명령줄에 라이브러리를 추가해야 합니다( -lprocps예제에서는 다른 라이브러리는 무시됩니다). 두 경우 모두 충돌이 발생하면 컴파일 및/또는 링크가 오류와 함께 중지됩니다.

관련 정보