libcairo 정의되지 않은 기호: Centos7의 컴파일된 MATLAB 응용 프로그램에서 R을 호출할 때 FT_Get_Var_Design_Cooperatives 오류가 발생합니다.

libcairo 정의되지 않은 기호: Centos7의 컴파일된 MATLAB 응용 프로그램에서 R을 호출할 때 FT_Get_Var_Design_Cooperatives 오류가 발생합니다.

몇 주 동안 저를 괴롭혔지만 StackExchange나 토론 게시판에서 답변을 찾을 수 없는 문제에 대한 해결책을 문서화하기 위해 이 질문을 게시합니다. (답변은 곧 제공됩니다)

Centos7 운영 체제에서 Application Compiler Toolbox(Matlab Compiler 6.4)를 사용하여 컴파일된 MATLAB 프로그램(MATLAB 2017a)을 실행하려고 합니다. 까다로운 부분은 내 Matlab 프로그램이 "system" 명령을 사용하여 R을 호출하고 rmarkdown 문서를 짜는 것입니다.

Linux 운영 체제에서 독립 실행형 MATLAB 프로그램을 실행하려면 LD_LIBRARY_PATH를 다음과 같이 설정해야 합니다.

export LD_LIBRARY_PATH={$LD_LIBRARY_PATH}:/usr/local/MATLAB/MATLAB_Runtimev92/v92/runtime/glnxa64:/usr/local/MATLAB/MATLAB_Runtimev92/v92/bin/glnxa64:/usr/local/MATLAB/MATLAB_Runtimev92/v92/sys/os/glnxa64:/usr/local/MATLAB/MATLAB_Runtimev92/v92/sys/opengl/lib/glnxa64

문제는 다음과 같은 방식으로 R이 중단된다는 것입니다.

In grDevices::png(f) :
  unable to load shared object '/usr/lib64/R/library/grDevices/libs//cairo.so':
  /lib64/libcairo.so.2: undefined symbol: FT_Get_Var_Design_Coordinates

R 코드를 별도로 테스트한 결과 sudo 권한으로 실행할 때 제대로 작동하는 것으로 나타났습니다. sudo 권한으로 실행하면 MATLAB 프로그램을 실행할 수 없기 때문에 이는 작동하지 않습니다.

sudo 권한이 LD_LIBRARY_PATH를 지우는 것으로 나타났습니다.LD_LIBRARY_PATH는 sudo 이후 항상 비어 있습니다.

내가 찾은 한 가지 해결 방법은 sudo를 사용하도록 MATLAB의 시스템 호출을 변경하는 것이었지만 프로그램이 실행되는 동안 사용자가 sudo 비밀번호를 입력해야 했기 때문에 성급하게 수정했습니다. 그래서 더 나은 해결책을 찾고 있습니다.

답변1

그래서 몇 가지 조사를 한 후에 libcairo의 문제가 실제로는 freetype의 문제라는 것을 발견했습니다. 이 문제-https://stackoverflow.com/questions/60782074/r-issue-unable-to-load-shared-object-cairo-so-on-linux-centos-7- 여러 freetype 라이브러리가 문제일 수 있다고 제안하지만 rpm freetype을 실행하면 다음과 같습니다.

rpm -q freetype
freetype-2.8-14.el7_9.1.x86_64
freetype-2.8-14.el7_9.1.i686

중복된 자유 형식 라이브러리를 찾을 수 없습니다.

결과적으로 운영 체제 라이브러리보다 먼저 LD_LIBRARY_PATH가 검색됩니다.https://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html

물론, 실행해 보면 다음과 같은 것을 발견했습니다:

sudo find / -type f -iname 'libfreetype.so.*'
/usr/lib/libfreetype.so.6.14.0
/usr/lib64/libfreetype.so.6.14.0
/usr/local/bin/glnxa64/libfreetype.so.6.11.1
/usr/local/MATLAB/MATLAB_Runtimev92/v92/bin/glnxa64/libfreetype.so.6.11.1
/usr/local/MATLAB/R2017a/bin/glnxa64/libfreetype.so.6.11.1

rpm이 수행할 수 없는 작업이 무엇인지 밝혀졌습니다. MATLAB에는 자체 freetype 라이브러리가 있습니다! LD_LIBRARY_PATH는 os freetype 라이브러리를 재정의합니다(이것이 sudo 실행 시 R이 작동하는 이유입니다).

가장 일관된 수정은 두 부분입니다.

  1. LD_LIBRARY_PATH가 독립 실행형 MATLAB 프로그램에 대한 원래 호출의 일부로만 설정되었는지 확인하십시오. 이는 컴파일 타임에 생성된 run_MyProgram.sh 파일을 통해 수행할 수 있습니다.
  2. MATLAB 코드에서 실행하기 전에 모든 "시스템" 호출이 LD_LIBRARY_PATH를 지우는지 확인하십시오. 즉:
function [status,cmdout]=systemAlt(cmd)
    if isunix()
        [status,cmdout]=system(['export LD_LIBRARY_PATH="";',cmd]);
    else
        [status,cmdout]=system(cmd);
    end
end

이상한 점은 이 작업을 수행하려면 새 글꼴도 다운로드해야 한다는 것입니다.

yum install xorg-x11-font*

그러니 저처럼 막히는 분이 계시다면 이 글이 도움이 되었으면 좋겠습니다.

관련 정보