LD_LIBRARY_PATH와 함께 ldconfig 및 ld.so.conf 사용

LD_LIBRARY_PATH와 함께 ldconfig 및 ld.so.conf 사용

저는 종종 gmp-6.1.2, mpfr-4.0.1, gcc-7.x 등 사용하기 위해 소스에서 다양한 라이브러리를 구축합니다. 이 작업을 수행할 때 나는 --prefix=/usr/local/gcc-7.2.0이것이 설치된 위치를 정확히 알고 기존 라이브러리를 망칠 필요가 없도록 이것을 사용하는 것을 선호합니다 . 그렇다면 기본적으로 내가 아는 것은 make install그것이 나에게 알려주는 마지막 것은 업데이트나 설정이라는 것입니다 LD_LIBRARY_PATH. 때로는 항상 그런 것은 아닙니다 LD_RUN_PATH.

대부분의 경우 LD_LIBRARY_PATH나중에 필요에 따라 수동으로 설정하거나 비슷한 방식으로 전역적으로 설정했는데 /etc/bash.bashrc.local효과가 있었습니다.

이는 다음을 의미합니다 make install.

Libraries have been installed in:
  /usr/local/mfprtest/lib

If you ever happen to want to link against installed libraries
in a given directory, LIBDIR, you must either use libtool, and
specify the full pathname of the library, or use the '-LLIBDIR'
flag during linking and do at least one of the following:
  - add LIBDIR to the 'LD_LIBRARY_PATH' environment variable
    during execution
  - add LIBDIR to the 'LD_RUN_PATH' environment variable
    during linking
  - use the '-Wl,-rpath -Wl,LIBDIR' linker flag
  - have your system administrator add LIBDIR to '/etc/ld.so.conf'

See any operating system documentation about shared libraries for
more information, such as the ld(1) and ld.so(8) manual pages.

더 좋은 방법이 있을까요?아니면 좀 더 공식적인 방법인가요?using ldconfig and ld.so.confthan using LD_LIBRARY_PATHand LD_RUN_PATH, and PATH? 이것은 특히 내 자신의 코드를 작성하기 위한 것이지만 다른 사용자에게도 적용될 수 있습니다. gmp와 같이 특정 Linux 버전에 설치된 것보다 최신인 다양한 버전의 라이브러리에 연결하고 싶습니다. , mpfr, gcc-5.x, gcc-6.x 또는 gcc-7.x와 같이 수동으로 설치된 다양한 gcc 버전을 사용합니다.

예를 들어 , 기본적으로 일단 설치되면 /usr/local/gcc-7.3.0나 자신과 시스템에서 홈브루 C, C++ 또는 포트란 소스 코드를 작성하거나 실행하는 다른 사람이 /usr/local/gcc-7.3.0대신 /usr/bin/ 및 /usr/64/에 있는 시스템 저장소를 사용하기를 원합니다.

답변1

해결 방법은 라이브러리 디렉터리를 (또는 의 파일 ) /usr/local/gcc-7.3.0/lib/에 추가하고 사용자의 셸 프로필을 실행하거나 변경하여 시스템의 /를 재정의하고 링커가 공유 개체를 찾을 수 있도록 별도의 항목을 추가하는 것입니다 ./etc/ld.so.conf/etc/ld.so.conf.d/ldconfigLD_LIBRARY_PATHLD_RUN_PATH*/lib

라이브러리 추가를 시작하면 유지 관리의 복잡성이 증가하므로 이를 염두에 두십시오.

다른 옵션은 링크의 모든 파일을 링크하는 것입니다 /usr/local/<library>/{bin,lib,include} into /usr/local/{bin,lib,include}. 이는 매우 단순화 ld.so.conf되거나 LD_LIBRARY_PATH/ LD_RUN_PATH비록 당신이 혼란스러운 상황 속에서 살아야 할 필요가 있을지라도 말입니다 /usr/local/{bin,lib,include}.

이를 수행하는 "공식적인" 방법은 시스템의 패키지 관리자를 사용하고 선택한 위치( 등)에 배포 라이브러리의 유지 관리 /usr/lib/버전을 설치하는 것입니다 /lib.

답변2

실행 파일(라이브러리와 반대)의 경우 사용자는 PATH해당 환경에서 올바른 설정을 가져야 합니다. 이는 자체 쉘 시작 파일이나 via와 같은 시스템 전체 시작 파일을 통해 수행될 수 있습니다 /etc/profile(그러나 이 파일은 모든 구성에서 읽을 수 있다고 보장되지는 않습니다).

이제 GMP 및 MPFR과 같은 라이브러리의 경우:

  1. GCC를 빌드할 때 실행 경로를 사용한 경우 GCC를 사용하기 위해 다른 작업을 수행할 필요가 없습니다. 라이브러리는 실행 경로를 통해 찾을 수 있습니다.
  2. 그렇지 않은 경우 또는 사용자가 다른 목적(예: 자체 소프트웨어 사용)으로 라이브러리를 직접 사용할 수 있도록 하려면 ldconfig아마도 를 사용하는 것이 /etc/ld.so.conf가장 좋은 솔루션일 것입니다. 그러나 사용자가 이러한 라이브러리에 대해 컴파일하려면 LIBRARY_PATHCPATH(또는 C_INCLUDE_PATH등) 도 필요합니다.

참고: 임시 항목(예: 테스트) 및 사용자 홈 디렉터리에 설치된 라이브러리( 사용자 측 구성 LD_LIBRARY_PATH에 해당하는 항목은 없는 것 같습니다)에는 여전히 유용합니다 . ldconfig하지만 그건 가능해실행 경로 재정의, 이는 어떤 경우에는 문제가 될 수 있습니다(예: make check방금 빌드된 라이브러리 및 이전 호환 버전이 이미 설치된 라이브러리 확인).

관련 정보