공유 라이브러리의 "대안"? 그게 효과가 있나요?

공유 라이브러리의 "대안"? 그게 효과가 있나요?

여러 가지 구현이 있는 공유 라이브러리에 대해 연결하려고 합니다. 특히 blas, openblas 및 atlas는 모두 /usr/lib/libblas.soUbuntu 14.04의 대안을 통해 동일한 바이너리 인터페이스를 제공합니다(12.04의 유사하지만 동일하지는 않은 설정). 링커 와 함께 GCC를 사용하면 -lblas실제 구현에 대한 대체 링크를 통해 실제로 해결되는 것처럼 보입니다. 예를 들어 openblas가 설치되어 있으면 실제 openblas 바이너리에 연결되고 결과 실행 파일을 시스템에 설치하면 atlas가 설치된 경우 대체 링크가 표시되지 않기 때문에 동적 링커가 라이브러리를 로드하지 못합니다.

GCC가 "대체" 기호 링크를 dl 대상으로 사용하여 실제로 의도한 대로 작동하도록 하는 방법이 있습니까 update-alternatives?

답변1

Symlink 해결은 여기의 기능입니다. libblas.so로 확인하면 libblas.so.3결과 실행 파일이 특정 so-버전으로 고정됩니다. (so 버전에 대한 변경, 즉 라이브러리의 바이너리 인터페이스가 이전 버전과 호환되지 않게 변경될 때 발생하므로 이것이 바람직합니다 3.libblas.so.3

문제는 대상 시스템에 가 없는 것 같습니다 libblas.so.3. 따라서 다음을 권장합니다.

  1. 애플리케이션이 libblas.so.3이미 링크되어 있는지 확인하세요.
  2. 대상 시스템에서 실제 libblas.so에서 필요한 libblas.so.3이름으로 심볼릭 링크를 생성합니다. 이 심볼릭 링크는 LD_LIBRARY_PATH에서 찾을 수 있습니다.

    mkdir ./mylib
    ln -s /usr/lib/libblas.so ./mylib/libblas.so.3
    LD_LIBRARY_PATH=$PWD/mylib:$LD_LIBRARY_PATH ./myexecutable
    

관련 정보