포함 디렉터리란 무엇입니까?

포함 디렉터리란 무엇입니까?

저는 소프트웨어 개발이 처음이고, 소스로부터 약 20개 정도의 프로그램과 의존성을 컴파일하는 과정에서 대략적인 패턴을 보았지만 잘 이해가 되지 않았습니다. 나는 당신이 이것에 대해 약간의 정보를 밝힐 수 있기를 바랍니다.

루트 액세스 없이 SLC6 시스템에서 SSH를 통해 연결하고 있습니다. 모든 소프트웨어 종속성을 설치해야 하며 가장 어려운 부분은 이를 올바른 위치에 연결하는 것입니다.

예: log4cpp를 설치해야 합니다. 타르볼을 다운로드하고 압축을 풀었습니다.

./autogen.sh (if there isn't this one, just continue to next)
./configure
make

따라서 소스 코드와 함께 폴더 자체에 설치되며 올바른 방식으로 호출할 수 있을 때까지 휴면 상태로 유지됩니다.

그런 다음 라이브러리를 지정하고 일부 종속성이 있는 디렉터리를 포함하도록 요청하는 다른 프로그램을 설치해야 합니다.

--with-log4cpp-inc=
--with-log4cpp-lib=

일부 소스 코드 컴파일의 경우 이 폴더에는 lib, bin 및 inc 또는 포함 디렉터리가 있습니다. 완벽합니다! 어떤 사람들에게는 이 폴더에 lib 및 inc 디렉터리만 있습니다. 어떤 사람들에게는 폴더에 inc 디렉토리만 있습니다.

모두가 찾기 쉬운 멋진 폴더를 가지고 있으면 문제가 없습니다. 하지만 log4cpp에 문제가 자주 발생합니다.

locate log4cpp.so

null 반환(lib 디렉터리에 .so 파일이 있습니까? 아니면 있습니까?)

그래서 문제가 있습니다. 이 특별한 경우에는 라이브러리 디렉토리가 없어 찾을 수 없습니다. 하지만 매번 문제가 어떻게 해결되는지와 배경 정보를 알고 싶습니다. 그러나 내 인터넷 검색 기술로는 라이브러리, 포함 및 bin 환경 변수가 작동하는 방식을 검색할 때 결과가 반환되지 않는 것 같습니다. 또한 프로그램에 대한 문서를 찾아보았지만 다음과 같은 질문이 있는 것 같습니다. "lib 디렉토리는 어디에 있고, include 디렉토리는 어디에 있습니까? bin 디렉토리는 어디에 있습니까?" 의사소통하다.

그래서:

  • 포함 디렉토리란 무엇이고, 무엇을 하며, 포함하고, 찾는 방법은 무엇입니까?
  • 라이브러리 디렉토리는 무엇이며, 무엇을 수행하고, 무엇이 포함되어 있으며, 어떻게 찾을 수 있습니까? 매번 유용한 명령은 무엇입니까?
  • 바이너리 디렉토리란 무엇이고, 무엇을 하는지, 무엇이 포함되어 있는지, 찾는 방법은 무엇입니까?

답변1

라이브러리 파일에는 일반적으로 lib;라는 접두사가 붙습니다. locate덜 구체적이면 명령이 더 성공적일 수 있습니다 locate "*log4cpp*".

공유 라이브러리(예: .so파일 - 일반적으로 그렇지만 반드시 그런 것은 아닙니다. 아래 "라이브러리 디렉토리란 무엇입니까?" 참조) 와 관련하여 whereis일반적으로 적절한 경로를 찾을 수 있지만 와일드카드는 지원되지 않으므로 이름을 정확하게 가져와야 합니다. 접미사 ( whereis liblog4cpp). ldconfig -p더 좋은 점은 말의 입에서 직접 정보를 얻기 때문입니다( ldconfig공유 라이브러리를 관리하는 링커에서 사용하는 캐시 구성).

ldconfig -p | grep log4cpp

이 라이브러리에 대해 빌드하려면 배포판에 기본적으로 설치되지 않을 수 있는 관련 포함 헤더도 필요합니다. 이러한 제품은 별도이거나 ​​패키지되어 -dev있습니다 -devel.

포함 디렉터리란 무엇입니까?

포함 디렉터리에는 다음과 같은 방식으로 소스 코드에 사용되는 C 및 C++ 헤더 파일이 포함되어 있습니다.

#include <foobar.h>
#include <foo/bar.h>

계층 구조로 구성되며 그 중 일부는 (C/C++) 언어 표준에 의해 지정됩니다. 그러나 계층 구조의 최상위 경로는 시스템별로 다르며 컴파일러/전처리기에 알려져 있습니다. 예를 들어 두 파일은 /usr/include/foobar.h및 에 있을 수 있습니다 /usr/include/foo/bar.h.

Linux 시스템에는 일반적으로 두 개의 최상위 포함 디렉터리가 있습니다 /usr/include( /usr/local/include후자가 우선합니다).

컴파일된 소프트웨어에는 포함 파일이 필요하지 않고 파일을 생성하는 데만 필요합니다. 따라서 libfoobar배포판 패키지에서 설치하면 얻을 수 있지만 패키지 에는 libfoobar.so포함되지 않습니다 (이름 지정 규칙은 배포판마다 다릅니다).foobar.hlibfoobar-dev

도서관 디렉토리란 무엇입니까?

라이브러리 디렉토리에는 동적(공유라고도 함) 및 정적이라는 두 가지 형태의 라이브러리가 포함되어 있습니다. 대부분은 전자입니다. 이는 대략 포함 디렉터리에 해당하지만 일반적으로 더 많은 디렉터리( /lib, /lib64, 등; 일부는 다른 디렉터리에 대한 기호 링크일 수 있음) /usr/lib가 있습니다 ./usr/local/lib

공유 라이브러리는 런타임에 사용되는 라이브러리입니다. 실행 파일이 공유 라이브러리에 링크된 경우 프로그램 실행에 필요한 만큼 해당 라이브러리의 일부가 모두 메모리에 로드됩니다. 이미 라이브러리를 사용하고 있는 항목은 이미 메모리에 있으므로 다시 로드할 필요가 없습니다. 공유 부분은 읽기 전용이므로 두 애플리케이션은 서로 간섭하지 않습니다. 관례적으로 공유 라이브러리는 접미사를 사용합니다 .so.

정적 라이브러리는 컴파일 타임에 실행 파일에 내장되며 이후에 실행 파일을 실행하는 데 필요하지 않습니다. 라이브러리를 다른 응용 프로그램과 공유할 수 없어 RAM을 많이 낭비할 수 있기 때문에 이는 덜 일반적입니다. 관례적으로 정적 라이브러리는 접미사를 사용합니다 .a.

바이너리 디렉터리란 무엇입니까?

바이너리 디렉토리에는 ls또는 와 같은 실행 가능 프로그램 파일이 포함되어 있습니다 firefox. *nix 세계의 실행 파일은 접미사를 사용하지 않습니다. 이러한 디렉토리는 일반적으로 변수에 있습니다 $PATH. 그렇지 않으면 항상 입력해야 합니다 /usr/bin/ls. 또는 명령을 사용하여 ls입력 시 사용할 실행 파일을 결정할 수 있습니다.whereiswhich


.configure라이브러리를 지정하거나 디렉토리를 포함하도록 허용된 경우 ,이는 일반적으로 비표준 위치에서만 필요합니다. 이 옵션 없이 시도해 보세요. 찾을 수 없으면 사용하세요 --with-inc=.

답변2

소스에서 패키지를 설치하는 표준 프로세스는 다음과 같습니다.

  1. ./configure
  2. make
  3. 선택사항: make test또는make check
  4. make install

Debian이나 Fedora와 같은 바이너리 배포판에서는 위의 네 가지 명령이 중앙 위치에서 실행된 다음 배포판 관리자가 이를 대중에게 공개하기 위해 패키지화하고 관리자는 이를 업데이트나 새 패키지로 패키지 관리자에 다운로드합니다. Gentoo 또는 Arch와 같은 소스 기반 배포판에서 패키지 관리자는 나열된 순서대로 나열된 4개의 명령을 실행합니다.

두 경우 모두 추적하는 종속성을 관리하는 것은 시스템의 패키지 관리자 소프트웨어에 달려 있습니다(시스템에 있는 경우). 그렇지 않으면 4단계가 누락됩니다. 4단계를 실행한 후 구성을 통해 컴파일한 다른 모든 패키지에 대한 libdirs 및 bindirs 스크립트를 찾을 수 있습니다.

관련 정보