예를 들어 비표준 접두사가 포함된 바이너리를 설치했는데 /opt/bin/foo
의 일부 정적 파일이 필요한 경우 /opt/share/foo
해당 파일을 어떻게 찾나요? 실행 파일( )을 기준으로 ../share/foo
역참조를 사용합니까? 컴파일 타임에 하드코딩되었나요?
무엇인가요구절애플리케이션은 변수 설치 접두어를 어떻게 처리합니까? 모든 디렉토리에 접두사가 붙어야 합니까? (무엇에 대해 /var
?)
답변1
컴파일 타임에 이러한 참조를 하드코딩하는 것이 일반적이며, 컴파일 타임 기본값을 재정의하기 위해 명령줄 옵션이나 환경 변수가 제공될 수 있습니다. 일반적으로 프로그램은 /etc
컴파일 시간 기본값을 재정의할 수 있는 구성 파일(보통 아래)의 위치만 기억합니다 . 이 접근 방식은 운영 체제를 만든 동일한 사람들이 Linux 배포판 또는 BSD 포트의 일부로 컴파일한 오픈 소스 소프트웨어에 가장 적합합니다.
바이너리 형식으로 배포된 애플리케이션의 경우 일반적인 접근 방식은 0번째 인수부터 시작하여 애플리케이션 바이너리를 찾는 것입니다. 관례적으로 0번째 매개변수는execve
(즉 argv[0]
)은 바이너리(호출자(보통 셸)가 준수하는 규칙)에 대한 경로입니다. argv[0]
포함되어 있지 않은 경우 /
애플리케이션은 $PATH
이에 대한 조회를 수행해야 합니다.
답변2
가장 일반적인 것은 감지 입니다 . 다양한 경로는 다양한 접두사로 제공될 수 있으며, autotools에는 별도의 시스템 구성(" "), 라이브러리 디렉터리(" ") 등이 --prefix
있습니다 ./etc
/usr/lib
답변3
프로그램을 컴파일하는 데 사용되는 도구(예: GNU Autotools)는 지정된 옵션의 값을 가져와 --prefix
헤더 파일에 정의로 넣을 수 있습니다.
#define PREFIX "/usr/local/"
코드에서는 PREFIX
경로 이름의 일부로 사용합니다.
답변4
Unded Unix에는 바이너리가 부팅되는 위치, 즉 컴파일 변수 설치 접두사를 감지하는 이식 가능한 방법이 없습니다.