使用Meson构建Pango静态库时依赖项链接失败
问题描述
尝试将Pango构建为静态库(采用Meson构建系统),编译步骤已完成,但链接阶段出现大量libfontconfig、libpixman-1和libpng的未定义引用错误。这些依赖库均已存在且可通过PKG_CONFIG_PATH找到,此前Cairo(1.17.8版本)的构建已完成。
构建Pango使用的命令:
meson setup --reconfigure --buildtype release --strip --prefix $INSTALL_ROOT/pango --libdir $INSTALL_ROOT/pango/lib --default-library static $BUILD_ROOT\pango $DOWNLOAD_ROOT/pango meson compile -C $BUILD_ROOT/pango meson install -C $BUILD_ROOT/pango
错误信息片段:
[361/445] Linking target subprojects/harfbuzz/util/hb-view FAILED: subprojects/harfbuzz/util/hb-view g++ -o subprojects/harfbuzz/util/hb-view subprojects/harfbuzz/util/hb-view.p/hb-view.cc.o -L/home/test/Intermediates/ThirdParty/BuildProducts/zlib/lib -I/home/test/Intermediates/ThirdParty/BuildProducts/zlib/include -Wl,--as-needed -Wl,--no-undefined -Wl,-O1 -fPIC -pthread -Wl,--start-group subprojects/harfbuzz/src/libharfbuzz.a /home/test/Intermediates/ThirdParty/BuildProducts/freetype/lib/libfreetype.a /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/libbz2.so /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/libz.so /home/test/Intermediates/ThirdParty/BuildProducts/cairo/lib/libcairo.a /home/test/Intermediates/ThirdParty/BuildProducts/glib/lib/libglib-2.0.a -lm /home/test/Intermediates/ThirdParty/BuildProducts/glib/lib/libpcre2-8.a -Wl,--end-group /bin/ld: /home/test/Intermediates/ThirdParty/BuildProducts/cairo/lib/libcairo.a(cairo-image-compositor.o): in function `lerp': cairo-image-compositor.c:(.text+0x86): undefined reference to `pixman_image_composite32' /bin/ld: cairo-image-compositor.c:(.text+0xca): undefined reference to `pixman_image_composite32' /bin/ld: /home/test/Intermediates/ThirdParty/BuildProducts/cairo/lib/libcairo.a(cairo-image-compositor.o): in function `_mono_finish_unbounded_spans': ... /bin/ld: /home/test/Intermediates/ThirdParty/BuildProducts/cairo/lib/libcairo.a(cairo-png.o): in function `write_png': cairo-png.c:(.text+0x304): undefined reference to `png_create_write_struct' cairo-png.c:(.text+0x31a): undefined reference to `png_create_info_struct' ...
解决思路
- 检查Cairo静态库的依赖链:静态库不会自动包含依赖的符号,你构建的Cairo静态库依赖pixman-1、libpng、fontconfig等库,需确保Meson在链接时能找到这些依赖。可通过
PKG_CONFIG_PATH包含这些依赖的.pc文件目录,或在Meson setup时显式指定路径。 - 显式传递缺失的依赖库:在
meson setup命令中添加参数手动指定缺失的库,示例:meson setup --reconfigure --buildtype release --strip --prefix $INSTALL_ROOT/pango --libdir $INSTALL_ROOT/pango/lib --default-library static -Dextra_libs="-lpixman-1 -lpng -lfontconfig" $BUILD_ROOT/pango $DOWNLOAD_ROOT/pango - 处理Harfbuzz的依赖传递:错误出在Harfbuzz工具的链接环节,需确保Harfbuzz能正确获取Cairo的全部静态依赖。可在Meson配置中强制Harfbuzz使用静态依赖,保证依赖链完整。
- 验证依赖库的静态版本:确认libfontconfig、libpixman-1、libpng均提供静态库(.a文件),仅动态库无法满足静态链接的符号解析需求。
- 调整链接器参数:链接命令中的
--as-needed可能跳过必要的静态库,可尝试移除该参数或调整Meson的链接标志,示例:meson setup --reconfigure --buildtype release --strip --prefix $INSTALL_ROOT/pango --libdir $INSTALL_ROOT/pango/lib --default-library static -Db_ldflags="-Wl,--no-as-needed" $BUILD_ROOT/pango $DOWNLOAD_ROOT/pango
内容的提问来源于stack exchange,提问作者Paavo
相关产品推荐
相关产品推荐

