라이브러리가 경로에 있는지 확인

라이브러리가 경로에 있는지 확인

라이브러리가 설치되어 있고 프로그램에서 사용 가능한지 테스트하고 싶다고 가정해 보겠습니다. 이를 사용하여 ldconfig -p | grep mylib시스템에 설치되어 있는지 확인할 수 있습니다. 하지만 라이브러리가 해당 설정을 통해서만 알려지면 어떻게 될까요 LD_LIBRARY_PATH?

이 경우 프로그램은 라이브러리를 찾을 수 있지만 ldconfig실제로는 찾을 수 없습니다. 라이브러리가 있는지 확인하는 방법결합된링커 경로?

실제로 프로그램이 없어도(예: 아직 컴파일되지 않은 경우) 작동할 수 있는 솔루션을 찾고 있다는 점을 덧붙여야 합니다. 단지 ld"존재하는 일부 라이브러리"에 대한 경로를 알고 싶습니다. 안에".

답변1

ldconfig 액세스할 수 있는 모든 라이브러리를 나열할 수 있습니다. 이러한 라이브러리는 캐시에도 저장됩니다.

/sbin/ldconfig -v -N모든 공통 라이브러리 경로가 캡처되어 캐시를 다시 작성하지 않고 사용 가능한 모든 라이브러리를 나열합니다(루트가 아닌 사용자인 경우 불가능함). LD_LIBRARY_PATH의 라이브러리는 고려하지 않지만(이 기사에서 편집하기 전에 말한 것과는 반대로) 다음 줄을 사용하여 다른 라이브러리를 명령줄에 전달할 수 있습니다.

/sbin/ldconfig -N -v $(sed 's/:/ /g' <<< $LD_LIBRARY_PATH)

답변2

gcc를 사용하여 간단한 테스트 프로그램을 컴파일하고 라이브러리를 연결할 수 있습니다. 그런 다음 ldd를 사용하여 사용된 라이브러리를 확인할 수 있습니다. 나는 다음과 같은 것을 사용합니다 :

echo "int main(){}" | gcc -x c++ -Wl,--no-as-needed -lmylib - && ldd a.out | grep mylib

-Wl,--no-as-needed해당 기호가 사용되지 않기 때문에 링커가 라이브러리를 삭제하는 것을 방지합니다.

답변3

다음과 같은 스크립트를 구현했습니다.여기:

#!/usr/bin/env python3

"""
Like `type` but for libs.
"""

from __future__ import print_function
from argparse import ArgumentParser
from glob import glob
import sys
import os


def parse_ld_conf_file(fn):
    paths = []
    for l in open(fn).read().splitlines():
        l = l.strip()
        if not l:
            continue
        if l.startswith("#"):
            continue
        if l.startswith("include "):
            for sub_fn in glob(l[len("include "):]):
                paths.extend(parse_ld_conf_file(sub_fn))
            continue
        paths.append(l)
    return paths


def get_ld_paths():
    # To be very correct, see man-page of ld.so.
    # And here: http://unix.stackexchange.com/questions/354295/what-is-the-default-value-of-ld-library-path/354296
    # Short version, not specific to an executable, in this order:
    # - LD_LIBRARY_PATH
    # - /etc/ld.so.cache (instead we will parse /etc/ld.so.conf)
    # - /lib, /usr/lib (or maybe /lib64, /usr/lib64)
    LDPATH = os.getenv("LD_LIBRARY_PATH") 
    PREFIX = os.getenv("PREFIX") # Termux & etc.
    paths = []
    if LDPATH: 
        paths.extend(LDPATH.split(":"))
    if os.path.exists("/etc/ld.so.conf"):
        paths.extend(parse_ld_conf_file("/etc/ld.so.conf"))
    else:
        print('WARNING: file "/etc/ld.so.conf" not found.')
    if PREFIX:
        if os.path.exists(PREFIX + "/etc/ld.so.conf"):
            paths.extend(parse_ld_conf_file(PREFIX + "/etc/ld.so.conf"))
        else:
            print('WARNING: file "' + PREFIX + '/etc/ld.so.conf" not found.')
        paths.extend([PREFIX + "/lib", PREFIX + "/usr/lib", PREFIX + "/lib64", PREFIX + "/usr/lib64"])
    paths.extend(["/lib", "/usr/lib", "/lib64", "/usr/lib64"])
    return paths


def main():
    arg_parser = ArgumentParser()
    arg_parser.add_argument("lib", help="Name of the library (e.g. libncurses.so)")
    args = arg_parser.parse_args()

    paths = get_ld_paths()
    for p in paths:
        fn = "%s/%s" % (p, args.lib)
        if os.path.exists(fn):
            print(fn)
            return

    print("Did not found %r in %r." % (args.lib, paths), file=sys.stderr)
    sys.exit(1)


if __name__ == "__main__":
    main()

답변4

$ gcc --print-file-name=libqdbm.so
/usr/lib/gcc/x86_64-linux-gnu/9/../../../../lib/libqdbm.so

관련 정보