wget의 소스 코드를 다운로드하고 정적 컴파일을 시도했습니다. 내가 따라온 단계는 다음과 같습니다.
./configure LDFLAGS=-static
표시되는 최종 출력은 다음과 같습니다.
Version: 1.17
Host OS: linux-gnu
Install prefix: /usr/local
Compiler: gcc
CFlags: -I/usr/include/p11-kit-1 -DHAVE_LIBGNUTLS -DNDEBUG
LDFlags: -static
Libs: -lpcre -lgnutls -lz
SSL: gnutls
Zlib: yes
PSL: no
Digest: yes
NTLM: auto
OPIE: yes
Debugging: yes
Assertions: no
Valgrind: Valgrind testing not enabled
Metalink: no
GPGME: no
그런 다음 make
긴 오류 목록을 던진 . 다음은 발췌 내용입니다:
init.o: In function `home_dir':
init.c:(.text+0x2bc): warning: Using 'getpwuid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
host.o: In function `getaddrinfo_with_timeout_callback':
host.c:(.text+0x495): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/libgnutls.a(gnutls_mpi.o): In function `_gnutls_x509_read_int':
(.text+0x6af): undefined reference to `asn1_read_value'
/usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/libgnutls.a(gnutls_mpi.o): In function `_gnutls_x509_read_int':
.
.
(.text+0x1a7a): undefined reference to `pthread_mutex_lock'
/usr/lib/gcc/i686-linux-gnu/4.8/libgcc_eh.a(unwind-dw2-fde-dip.o): In function `_Unwind_Find_FDE':
(.text+0x1ac9): undefined reference to `pthread_mutex_unlock'
collect2: error: ld returned 1 exit status
make[3]: *** [wget] Error 1
make[2]: *** [all] Error 2
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2
비슷한 문제가 발생한 사람이 있습니까? 그렇다면 해결책을 게시해 주세요. 미리 감사드립니다
답변1
정적 연결을 사용하면 공유 객체처럼 종속성이 ld
마술처럼 자동으로 검색되지 않습니다 . wget
일부 스크립트는 이러한 목록을 생성하려고 시도하지만 일부는 그렇지 않습니다. 후자의 상황에 직면했습니다.
라이브러리 목록과 해당 종속 항목을 직접 만들어야 합니다.
정적 바이너리의 전체 deps 목록이 무엇인지 아직 모른다면 먼저 이를 정상적으로 빌드(공유)한 다음 wget을 사용하여 wget 빌드 바이너리 가 있는 wget
목록을 가져와야 합니다 (소스에서 찾을 수 있음). 트리, 일반적으로 다음과 같습니다 )ldd /path/to/wget
/path/to/wget
src/wget
공유 라이브러리의 모든 정적 버전을 구해야 합니다. 일반적으로 배포판과 함께 제공되는 -dev 또는 devel 패키지에 포함되어 있습니다.
목록의 각 라이브러리는 ld
특정 기호 및 오류에 대해 모든 정적 아카이브를 검색하려는 시도가 이루어지지 않기 때문에 두 번 이상 다시 정렬하거나 추가해야 합니다. 따라서 libgnutls.a는 libtasn1.a의 asn1_* 기호에 따라 달라질 수 있습니다. 그런 다음 명령줄에 다음을 추가해야 합니다 -lgnutls -ltasn1
. libtasn1.a에 의존하는 다른 라이브러리가 있는 경우 이를 링크 명령줄에 다시 추가해야 합니다.
정의되지 않은 기호는 를 사용하여 정적 라이브러리의 기호 목록을 보면 확인할 수 있습니다 nm /usr/lib/lib.a
. 또는 일부 디렉토리에서 사용하십시오 fgrep -l symbol_name /usr/lib/*.a
. 이러한 검색(fgrep 사용)은 해당 기호를 요구하고 제공하는 두 개의 라이브러리를 표시하므로 이는 빠른 테스트일 뿐입니다.
LIBS=
라이브러리는 configure
스크립트 에 변수를 추가할 수 있습니다 LIBS="-lgnutls -ltasn1"
.