정적 객체를 포함하는 바이너리 빌드

정적 객체를 포함하는 바이너리 빌드

관련 .so 파일을 포함하는 바이너리를 빌드하여 바이너리를 한 번 빌드하고 .so 파일 없이 동일한 하드웨어 및 운영 체제를 사용하는 시스템에서 사용할 수 있습니까?

예를 들어, 저는 nghttp2를 사용하여 컬을 만들고 있습니다. 그래요

 ./configure --with-nghttp2=/usr/local

그런 다음 나는 달렸다. 컬 바이너리를 얻었습니다. 이 바이너리를 다른 컴퓨터에 복사하고 실행하려고 하면 다음과 같이 표시됩니다.

./curl: error while loading shared libraries: libnghttp2.so.14: cannot open shared object file: No such file or directory

또한 다음과 같이 make를 실행해 보았습니다.

make SHARED=0 CFLAGS='-static'

여전히 같은 오류가 발생합니다.

답변1

종속 .so 파일은 공유 개체(.so 파일) 또는 .a 파일(정적 개체라고도 함) 형식일 수 있습니다. nghttp2를 다시 빌드하고 --disable-shared해당 구성에 플래그를 전달할 수 있습니다. 그런 다음 평소대로 컬을 재구성하고 다시 빌드할 수 있습니다.

핵심은 /usr/local/lib에 있는 정적 .a 개체만 컬에 연결될 수 있는지 확인하는 것입니다.

/usr/local/lib에 nghttp2의 .so 버전이 포함되어 있지 않은지 확인하는 것을 잊지 마세요! (또는 다른 --prefix=를 지정하여 실험할 수도 있습니다. /tmp 또는 $HOME에 무엇이든 설치하고 로컬로 생성된 트리를 사용할 수도 있습니다)

이 점에 유의하시기 바랍니다~하지 않을 것이다컬은 타사 코드에 의존하는 대규모 프로젝트이므로 다른 종속성을 제거합니다. libcurl 자체에 의존할 수도 있습니다. --disable-shared플래그를 전달하여 정적 버전만 빌드할 수 있습니다 . 마지막으로 readelf -d /path/to/your/curl | fgrep NEEDED전체 종속성을 확인하려면 실행하세요!

관련 정보