因此,我试图从源代码构建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上的链接依赖关系,我可以看到以下内容:
...
libfreetype.so.6 => /usr/people/xxxx/local/lib/libfreetype.so.6 (0x00007f2323b0f000)更进一步,在libfreetype.so上运行objdump (我也是从源代码中安装的)得到:
00000000000148f0 g DF .text 0000000000000152 Base FT_Get_Advance
0000000000014700 g DF .text 00000000000001ed Base FT_Get_Advances尽管安装在系统上的版本( in /usr/lib/ (我没有根访问权限))没有对FT_Get_Advance的引用。
它看起来像是代码引用全局库的地方,尽管我似乎找不到哪里。有人有什么想法吗?
编辑:我刚刚在libharfbuzz.so上运行了一个objdump (安装在我的主目录中的版本),而且似乎有许多对freetype和GLIBC的未定义引用.那么,我编写harfbuzz的方法有什么问题?
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发布于 2015-04-21 20:37:36
2件事:
1) Harfbuzz和FreeType显然有一个臭名昭著的循环依赖关系。这意味着您确实需要对两者进行自己的构建,并且在一个与系统库完全隔离的地方进行构建。
2)根据经验,GCC构建工具会在您自己的任何定制构建之前找到系统库(例如通过pkgconfig、FindXXX.cmake、环境vars等)。除非你明确告诉他们先看看你的。毕竟,这是他们所针对的主要用例。检查您的CMakeLists.txt或Makefile是否在FreeType版本中显式链接,而不是任何OS版本。听起来你的构建是第一次找到操作系统,然后(错误地)尝试使用它。
为了测试您是否获得了正确的FreeType,您可以备份您的版本,然后修改主要版本#。重新运行构建,然后在构建的-d上运行"ldd“或"readelf libharfbuzz.so”,并确认您看到了链接到的正确版本的自由类型。
顺便说一句,建造Pango来使用Harfbuzz的操作顺序似乎是:
( A)建立“普通”FreeType
( B)建造哈夫巴斯
( C)用Harfbuzz构建新的自由类型
( D)最后,使用步骤(C)中的FreeType构建Pango,并显式地加上Harfbuzz。
我还没有试过,但这是各种指示给我的指示。我可能会完全传递哈夫巴斯,除非你确定你需要它,因为它的引入似乎也意味着重建FreeType。
https://unix.stackexchange.com/questions/80006
复制相似问题