Mac版OpenJDK9打包FreeType:libfreetype引用问题求助
解决Mac平台OpenJDK9打包FreeType的依赖问题
我之前帮朋友处理过类似的JDK打包依赖问题,结合OpenJDK9的构建逻辑,给你梳理几个关键步骤,应该能解决终端用户无需额外安装FreeType的需求:
1. 先编译静态链接版的FreeType
静态链接是最稳妥的方式,这样JDK编译完成后就不会依赖系统里的FreeType动态库。操作步骤如下:
- 解压你下载的FreeType源码包,进入源码目录
- 执行配置命令,指定安装路径并开启静态编译:
(关闭一些不需要的依赖能减少库体积,如果你需要这些依赖可以去掉对应的./configure --prefix=/Users/yourname/local/freetype-static --enable-static --disable-shared --with-harfbuzz=no --with-bzip2=no --with-png=no--with-xxx=no) - 然后编译安装:
这样在指定的make -j8 && make installprefix路径下,你会得到lib/libfreetype.a这个静态库文件。
2. 修改OpenJDK9的构建参数,指定静态FreeType路径
OpenJDK构建时允许指定第三方依赖的位置,你需要在configure阶段加入FreeType的相关参数:
- 进入OpenJDK9的源码根目录,执行configure命令时加上:
这里的bash configure --with-freetype-include=/Users/yourname/local/freetype-static/include --with-freetype-lib=/Users/yourname/local/freetype-static/lib --enable-static-libs--enable-static-libs会让JDK尽可能链接静态库,确保fontmanager模块会链接我们编译的libfreetype.a而不是系统的动态库。
3. 动态库备选方案:调整依赖路径并打包
如果你因为某些原因必须用动态库,那就要把FreeType的动态库打包进JDK,并修改依赖路径:
- 编译FreeType时开启动态库:
./configure --prefix=/xxx/freetype-dynamic --enable-shared --disable-static - 构建JDK时指定这个动态库路径,完成后把
libfreetype.6.dylib复制到JDK的lib目录下(比如jdk-9.jdk/Contents/Home/lib) - 用
install_name_tool修改JDK中依赖FreeType的库(比如libfontmanager.dylib)的引用路径:
这样JDK运行时会从自身的lib目录加载FreeType,而不是找系统的。install_name_tool -change /usr/local/lib/libfreetype.6.dylib @rpath/libfreetype.6.dylib /path/to/your/jdk/lib/libfontmanager.dylib
4. 验证最终效果
构建完成后,用otool -L命令检查JDK的libfontmanager.dylib:
otool -L /path/to/your/jdk/lib/libfontmanager.dylib
如果是静态链接,你不会看到libfreetype.6.dylib的依赖项;如果是动态链接,应该显示@rpath/libfreetype.6.dylib而不是系统路径。之后把JDK和你的应用一起打包,拿到一台没有安装FreeType的Mac上测试运行,确认不需要额外安装就能正常工作。
内容的提问来源于stack exchange,提问作者Scott Molling
相关产品推荐
相关产品推荐

