관련 .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
전체 종속성을 확인하려면 실행하세요!