だから私はソースから(私のホームディレクトリに、私が必要とする他のものへの依存関係として)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/にあります(rootアクセス権はありません)、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を再構築することを意味するように見えるからです。