소스에서 pango(1.34.1) 및 harfbuzz(0.9.18)를 빌드하려고 할 때 오류가 발생했습니다.

소스에서 pango(1.34.1) 및 harfbuzz(0.9.18)를 빌드하려고 할 때 오류가 발생했습니다.

그래서 나는 소스에서 (내 홈 디렉토리에, 내가 필요한 다른 것들에 대한 의존성으로) pango를 빌드하려고 합니다. 이는 SLES 11을 실행하는 컴퓨팅 클러스터에 있습니다. 컴파일할 때 다음 오류가 발생합니다.

...
Making all in examples
make[2]: Entering directory `/usr/people/xxxx/downloads/pango-1.34.1/examples'
  CC       cairosimple.o
  CCLD     cairosimple
/usr/people/xxxx/local/lib/libharfbuzz.so: undefined reference to `FT_Get_Advance'
collect2: ld returned 1 exit status
make[2]: *** [cairosimple] Error 1
make[2]: Leaving directory `/usr/people/xxxx/downloads/pango-1.34.1/examples'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/usr/people/xxxx/downloads/pango-1.34.1'
make: *** [all] Error 2

libharfbuzz.so에서 링크 종속성을 확인하면 다음 정보가 제공됩니다.

ldd ~/local/lib/libharfbuzz.so

...
libfreetype.so.6 => /usr/people/xxxx/local/lib/libfreetype.so.6 (0x00007f2323b0f000)

한 단계 더 나아가 libfreetype.so(소스에서도 설치함)에서 objdump를 실행하면 다음과 같은 결과를 얻습니다.

objdump -T ~/local/lib/libfreetype.so.6 objdump -T ~/local/lib/libfreetype.so.6 grep FT_Get_Advance

00000000000148f0 g    DF .text  0000000000000152  Base        FT_Get_Advance
0000000000014700 g    DF .text  00000000000001ed  Base        FT_Get_Advances

시스템에 설치된 버전이 /usr/lib/에 있지만(루트 액세스 권한이 없음) FT_Get_Advance에 대한 참조가 없습니다.

코드가 어딘가에 전역 라이브러리를 참조하는 것 같지만 위치를 찾을 수는 없습니다. 누구든지 아이디어가 있나요?

편집하다:방금 libharfbuzz.so(내 홈 디렉토리에 설치된 버전에서)에서 objdump를 실행했는데 freetype 및 GLIBC에 대한 정의되지 않은 참조가 많이 있는 것 같습니다... 그렇다면 제가 harfbuzz를 컴파일하는 방식에 어떤 문제가 있습니까?

objdump -T libharfbuzz.so | objdump -T libharfbuzz.so grep *UND*

0000000000000000      DF *UND*  0000000000000000              FT_Get_Advance
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 mprotect
0000000000000000      DF *UND*  0000000000000000              FT_Load_Sfnt_Table
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 memset
0000000000000000      DF *UND*  0000000000000000              FT_Set_Char_Size
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 snprintf
0000000000000000      DF *UND*  0000000000000000              FT_Select_Charmap
0000000000000000      DF *UND*  0000000000000000              g_intern_static_string
0000000000000000      DF *UND*  0000000000000000              g_unichar_combining_class
0000000000000000      DF *UND*  0000000000000000              FT_Load_Glyph
0000000000000000  w   D  *UND*  0000000000000000              __gmon_start__
0000000000000000  w   D  *UND*  0000000000000000              _Jv_RegisterClasses
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 __assert_fail
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 strncmp
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 malloc
0000000000000000      DF *UND*  0000000000000000             g_unicode_script_to_iso15924
0000000000000000      DF *UND*  0000000000000000              FT_Done_FreeType
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 __cxa_atexit
0000000000000000      DF *UND*  0000000000000000              g_unichar_get_mirror_char
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 sysconf
0000000000000000      DF *UND*  0000000000000000              g_unichar_compose
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 pthread_mutex_init
0000000000000000      DF *UND*  0000000000000000              g_unicode_script_from_iso15924
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 free
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 strlen
0000000000000000      DF *UND*  0000000000000000                FT_Face_GetCharVariantIndex
0000000000000000  w   DF *UND*  0000000000000000  GLIBC_2.2.5 __cxa_finalize
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 bsearch
0000000000000000      DF *UND*  0000000000000000              FT_Get_Name_Index
0000000000000000      DF *UND*  0000000000000000              FT_Get_Kerning
0000000000000000      DF *UND*  0000000000000000              g_unichar_decompose
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 strerror
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 strstr
0000000000000000      DF *UND*  0000000000000000              g_unichar_type
0000000000000000      DF *UND*  0000000000000000              FT_Init_FreeType
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 strtol
0000000000000000      DF *UND*  0000000000000000              g_unichar_iswide
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 memcpy
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 memmove
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 strchr
0000000000000000      DF *UND*  0000000000000000              g_unichar_get_script
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 getenv
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 __errno_location
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 qsort
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 strdup
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 strcmp
0000000000000000      DF *UND*  0000000000000000              FT_New_Memory_Face
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 calloc
0000000000000000      DF *UND*  0000000000000000              FT_Get_Char_Index
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 strncpy
0000000000000000      DF *UND*  0000000000000000              g_once_init_enter
0000000000000000      DF *UND*  0000000000000000              FT_Get_Glyph_Name
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 pthread_mutex_lock
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 realloc
0000000000000000      DF *UND*  0000000000000000              FT_Done_Face
0000000000000000      DF *UND*  0000000000000000              g_once_init_leave
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 setlocale
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 pthread_mutex_destroy
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 strtoul
0000000000000000      DF *UND*  0000000000000000  GLIBC_2.2.5 pthread_mutex_unlock
0000000000000000      DF *UND*  0000000000000000              g_unichar_fully_decompose
0000000000000000      DF *UND*  0000000000000000              g_boxed_type_register_static

답변1

2가지:

1) Harfbuzz와 FreeType은 분명히 악명 높은 순환 의존성을 가지고 있습니다. 이는 시스템 라이브러리와 완전히 격리된 장소에서 두 가지 모두를 직접 빌드해야 함을 의미합니다.

2) 경험상 GCC 빌드 도구는 시스템 라이브러리를 보라고 명시적으로 지시하지 않는 한 사용자 정의 빌드(예: pkgconfig, FindXXX.cmake, 환경 변수 등을 통해)보다 먼저 시스템 라이브러리를 찾습니다. 첫 번째. 결국 이것이 그들이 목표로 삼는 주요 사용 사례입니다. CMakeLists.txt 또는 Makefile이 FreeType 버전(OS 버전 아님)에 명시적으로 링크되어 있는지 확인하세요. 빌드가 먼저 운영 체제를 찾은 다음 (잘못) 이를 사용하려고 시도하는 것 같습니다.

올바른 FreeType을 받고 있는지 테스트하려면 FreeType을 백업한 다음 주요 버전 번호를 변경하면 됩니다. 빌드를 다시 실행한 다음 libharfbuzz.so 빌드에서 "ldd" 또는 "readelf -d"를 실행하고 연결된 Freetype의 올바른 버전이 표시되는지 확인하세요.

그런데 Harfbuzz를 사용하기 위해 Pango를 빌드하려면 작업 순서는 다음과 같습니다.
A) "일반" FreeType 빌드
B) Harfbuzz 빌드
C) Harfbuzz를 사용하여 새 Freetype 빌드
D) 마지막으로 (C) 단계에서 FreeType을 사용하여 명시적으로 Pango를 빌드합니다. Harfbuzz를 추가했습니다.

아직 시도하지는 않았지만 다양한 지침이 나에게 준 것입니다. 꼭 필요하다고 확신하지 않는 한 Harfbuzz를 완전히 포기할 것입니다. 왜냐하면 Harfbuzz를 도입한다는 것은 FreeType을 다시 빌드하는 것을 의미하는 것처럼 보이기 때문입니다.

관련 정보