저는 젠투에서 완전히 정적으로 링크된 바이너리를 만드는 방법을 찾고 있습니다.
빌드 시스템은 Meson입니다. 나는 시도했지만 --prefer-static
성공 --default_library=static
하지 못했습니다.
한 가지 가능한 장애물은 일부 라이브러리(예: libevent
및 glib
)에 정적 버전이 설치되어 있지 않다는 것입니다( libc
다른 라이브러리와 달리). emerge
특별한 플래그를 사용하여 다시 실행 해야 하나요 ?
답변1
적용 가능한 모든 패키지의 정적 링크 지원
--static
더 안전한 접근 방식은 젠투 전용 라이브러리로 필요한 라이브러리를 컴파일하는 것보다 전체 시스템을 정적으로 만드는 것입니다 . static-libs
당신이있는 것처럼온라인 패키지 저장소, 많은 소프트웨어 패키지가 static
USE 플래그를 지원합니다.
정적 연결이란 무엇입니까?
정적 링크는 사용자가 특정 애플리케이션 라이브러리에 액세스할 수 없는 임베디드 시스템이나 장치의 프로그램에 유용합니다. Windows 기반 시스템에서 이러한 라이브러리는 일반적으로 .DLL
확장명(약어)을 가진 파일 로 저장됩니다 Dynamic Linking Library
. Linux에서 이러한 라이브러리는 일반적으로 확장자가 .so
또는 .so.versionNumberOfProgramThatUsesLibrary
(공유 객체의 약자)인 파일로 저장됩니다. 정적으로 컴파일되면 위에서 설명한 라이브러리 파일이 컴파일된 프로그램과 함께 제공되므로 사용자는 전체 쓰기 액세스 권한이 있는 홈 디렉터리에 완성된 프로그램을 복사할 수 있으며 프로그램은 동일한 라이브러리 대신 해당 홈 디렉터리의 라이브러리 파일을 사용합니다. 파일 . 사용자가 액세스할 수 없는 호스트 시스템의 라이브러리입니다. 정적 연결과 동적 연결에 대한 자세한 내용은 다음을 참조하세요.정적 라이브러리와 동적(공유) 라이브러리 링크의 차이점은 무엇입니까?
경고에 주의하다
Gentoo의 첫해에 사용자는 다양한 단계의 타르볼에서 시스템을 구축할 수 있었으며, 당시에 허용된 프로세스였던 1단계를 사용하여 이 작업을 한두 번 수행했다고 자랑스럽게 생각합니다. 바라보다Gentoo Wiki의 스테이지 타르볼.. 경고 내용은 다음과 같습니다.
부팅 중에는 이것을 설정하지 마십시오! 바이너리가 동적으로 링크되는 대신 정적으로 링크되도록 합니다.
첫 번째 단계에 적용됩니다. 피하기 위해 존재한다닭이 먼저냐, 달걀이 먼저냐?. 정적 라이브러리를 사용하여 정적 라이브러리 파일을 빌드할 수 없기 때문에 정적 라이브러리를 사용하는 프로그램이나 라이브러리가 없는 프로그램에는 라이브러리 파일을 포함할 수 없습니다. 다시 말해서:정적 라이브러리를 빌드하고 이를 프로그램에 포함하려면 호스트 시스템의 동적 링크 라이브러리를 사용해야 합니다..
젠투에서 이를 수행하는 방법
USE 플래그 및/또는 구성 파일을 미세 조정하십시오(훌륭한 도구는응용프로그램-포티지/ufed
static
, USE Flag Editor의 약어)는 새로 설치된 시스템에서 작동하지만 또는 을 추가하지 마십시오static-libs
. 이를 통해 데스크탑 환경, 사운드 지원, 커널 재구축 등을 추가할 수 있으며 기본@system
세트가 동적 라이브러리를 계속 사용할 수 있습니다.- 확실하게 하다2단계는 오류 없이 완료되었습니다. 또한 2단계를 여러 부분으로 나눌 수 있습니다. 예를 들어 데스크톱 지원을 활성화하고
emerge
해당 지원을 구축하기 위해 사용 및 재실행ufed
하고 일부 유형의 그래픽 지원을 추가한 다음emerge
다시 실행합니다.
- 확실하게 하다2단계는 오류 없이 완료되었습니다. 또한 2단계를 여러 부분으로 나눌 수 있습니다. 예를 들어 데스크톱 지원을 활성화하고
다시 실행
ufed
하고 USE 플래그를 추가static
하세요static-libs
. 그런 다음 전체 트리를 다시 작성하고 각 패키지에 대한 지원 및 USE 플래그를 업데이트하려면emerge -ea
for를 실행하십시오.--empty-tree --ask
static
static-libs
나는 이 방법을 "2패스 방탄 방법, 2패스 컴파일이라고도 함"이라고 부릅니다. 2단계의 첫 번째 단계에서는 3단계 시작 시 문제가 없는지 확인합니다. 3단계의 두 번째 패스가 어떤 식으로든 실패하는 경우 자유롭게 오류를 수정하고 3단계를 다시 시작하거나 emerge --resume
이전 단계의 어떤 것도 사용자의 오류로 인해 손상되지 않을 것이라는 점을 알고 사용하고 계속할 수 있습니다. 이전에는 오류를 수정한 후 잘못된 패키지는 설치되지 않습니다.)
중간자
우리가 보면개발 유틸리티/중간자패키지 저장소에서 우리는 볼 수 있습니다전자 빌드USE 플래그를 직접 지원하지는 않지만 static
많은 종속성이 지원하므로 static
원하는 static-libs
것을 얻을 수 있습니다.