为何pkg-config与i686-w64-mingw32-pkg-config识别包不同?如何配置专属lept.pc?
嘿,我来帮你搞定这个交叉编译时pkg-config识别Leptonica的问题!
系统默认的pkg-config和交叉编译用的i686-w64-mingw32-pkg-config是完全独立的工具,它们的搜索路径天生不一样:
- 系统
pkg-config专门找**Ubuntu本地(x86_64)**的库配置文件(.pc),默认路径通常是/usr/lib/pkgconfig、/usr/share/pkgconfig这类系统目录。 i686-w64-mingw32-pkg-config是为交叉编译到Windows(i686对应Win32平台)设计的,它只会搜索针对mingw编译的库配置,默认路径一般是/usr/i686-w64-mingw32/lib/pkgconfig、/usr/i686-w64-mingw32/share/pkgconfig。
你可以直接查看两者的搜索路径验证:
# 查看系统pkg-config的搜索路径 pkg-config --variable pc_path pkg-config # 查看交叉编译版pkg-config的搜索路径 i686-w64-mingw32-pkg-config --variable pc_path pkg-config
你之前装的libleptonica-dev是给Ubuntu本地程序用的,.pc文件会放到系统pkg-config的搜索路径里,所以交叉版找不到完全正常。
要让i686-w64-mingw32-pkg-config识别Leptonica,你必须针对Windows平台交叉编译Leptonica,生成适配mingw的库和.pc文件。步骤如下:
下载Leptonica源码:
从Leptonica官方渠道下载最新源码包,或者用git克隆源码仓库(终端执行:git clone https://github.com/DanBloomberg/leptonica.git)。创建交叉编译构建目录:
cd leptonica mkdir cross-build && cd cross-build
- 配置交叉编译环境:
用mingw的工具链指定目标平台,同时设置安装路径(推荐装到交叉工具链的默认系统目录,这样交叉pkg-config能自动找到):
../configure --host=i686-w64-mingw32 --prefix=/usr/i686-w64-mingw32
如果你不想装到系统目录,也可以指定自定义路径,比如--prefix=$HOME/mingw-leptonica,后续需要手动配置环境变量。
- 编译并安装:
# 并行编译(加快速度) make -j$(nproc) # 安装到指定路径(如果用系统prefix需要sudo) sudo make install
如果你选择把Leptonica装到自定义目录(比如$HOME/mingw-leptonica),需要设置PKG_CONFIG_PATH环境变量,告诉交叉pkg-config去哪里找.pc文件:
export PKG_CONFIG_PATH=$HOME/mingw-leptonica/lib/pkgconfig:$PKG_CONFIG_PATH
设置后直接测试:
i686-w64-mingw32-pkg-config --list-all | grep lept
应该就能看到Leptonica的配置了。
另外,也可以在编译你的目标程序(比如tesseract)时临时指定路径:
PKG_CONFIG_PATH=$HOME/mingw-leptonica/lib/pkgconfig ./configure --host=i686-w64-mingw32 [其他配置参数]
执行以下命令检查交叉pkg-config是否能正确获取编译参数:
# 获取头文件路径 i686-w64-mingw32-pkg-config --cflags lept # 获取链接库路径 i686-w64-mingw32-pkg-config --libs lept
如果能输出包含mingw路径的头文件和库信息,就说明配置成功了。
最后提个小提醒:如果你目标是编译Win64程序,应该用x86_64-w64-mingw32-*系列工具链,而不是i686-w64-mingw32-*(后者对应Win32平台),别搞错了哦!
内容的提问来源于stack exchange,提问作者progquester

