Windows 下编译 OSRA

通过网盘分享的文件:osra.rar
链接: https://pan.baidu.com/s/1P50_Uzy7kEmjzcCxVJf_lg?pwd=28pc
通过网盘分享的文件:require.rar
链接: https://pan.baidu.com/s/10qgnZVL3-wPqZYn1ZBBXBg?pwd=57v6

Windows 下编译 OSRA 2.2.4

本文记录在 Windows + MSYS2 UCRT64 环境下编译 OSRA 2.2.4 的过程。项目源码目录为:

C:\Users\www\Desktop\osra-2.2.4

依赖源码包放在项目根目录的 require 文件夹中。

一、准备环境

安装 MSYS2,并使用 UCRT64 工具链。本文使用的主要环境如下:

MSYS2: C:\msys64
GCC: 16.1.0
CMake: 4.3.3
OpenBabel: 3.1.1-4
GraphicsMagick: 1.3.47
Poppler: 26.04.0
Potrace: 1.16

查看版本命令:

C:\msys64\ucrt64\bin\gm.exe version
C:\msys64\ucrt64\bin\potrace.exe --version
C:\msys64\ucrt64\bin\obabel.exe -V
C:\msys64\usr\bin\bash.exe --noprofile --norc -lc "pkg-config --modversion poppler-cpp"

二、解包并编译依赖

require 目录中包含:

gocr-0.50pre-patched-2.tgz
ocrad-0.23.tar.lz
tclap-1.2.1.tar.gz
potrace-1.16.win64.tar.gz
poppler-26.06.0.tar.xz
GraphicsMagick-1.4.020260611.tar.xz

实际编译时,GraphicsMagick、OpenBabel、Poppler、Potrace 使用 MSYS2 UCRT64 已安装版本。TCLAP、GOCR、OCRAD 使用 require 中的源码。

创建本地安装目录:

mkdir build\local
mkdir build\src
mkdir build\tmp
mkdir build\home

在 MSYS2 bash 中设置环境:

export PATH=/ucrt64/bin:/usr/bin:/bin:$PATH
unset TMPDIR

如果 GCC 报错:

Cannot create temporary file in C:\msys64\tmp\: Permission denied

需要在 PowerShell 中设置临时目录:

$env:TMP="C:\Users\www\Desktop\osra-2.2.4\build\tmp"
$env:TEMP=$env:TMP

三、编译 TCLAP

cd /c/Users/www/Desktop/osra-2.2.4
tar -xzf require/tclap-1.2.1.tar.gz -C build/src
cd build/src/tclap-1.2.1

./configure --prefix=/c/Users/www/Desktop/osra-2.2.4/build/local
make install

如果安装阶段因为 /c/Users/... 权限失败,可以手动复制头文件:

mkdir build\local\include\tclap
Copy-Item -Recurse -Force build\src\tclap-1.2.1\include\tclap\* build\local\include\tclap\

四、编译 GOCR

cd /c/Users/www/Desktop/osra-2.2.4
tar -xzf require/gocr-0.50pre-patched-2.tgz -C build/src
cd build/src/gocr-0.50pre-patched-2

./configure --prefix=/c/Users/www/Desktop/osra-2.2.4/build/local
make libs
make install

如果安装失败,手动复制:

mkdir build\local\include\gocr
mkdir build\local\lib
mkdir build\local\bin

Copy-Item -Force build\src\gocr-0.50pre-patched-2\include\*.h build\local\include\gocr\
Copy-Item -Force build\src\gocr-0.50pre-patched-2\src\*.h build\local\include\gocr\
Copy-Item -Force build\src\gocr-0.50pre-patched-2\src\libPgm2asc.a build\local\lib\
Copy-Item -Force build\src\gocr-0.50pre-patched-2\src\gocr.exe build\local\bin\

五、解包并编译 OCRAD

OCRAD 是 .tar.lz 格式。如果系统没有 lzip,可以用 Python 解包。创建 build/decode_lzip.py

import lzma
import pathlib
import struct
import zlib

src = pathlib.Path("require/ocrad-0.23.tar.lz")
data = src.read_bytes()

code = data[5]
bits = code & 0x1F
frac = (code >> 5) & 7
dict_size = (1 << bits) - ((1 << bits) // 16) * frac

payload = data[6:-20]
crc_expected, size_expected, member_size = struct.unpack("<IQQ", data[-20:])

dec = lzma.LZMADecompressor(
    format=lzma.FORMAT_RAW,
    filters=[{"id": lzma.FILTER_LZMA1, "dict_size": dict_size, "lc": 3, "lp": 0, "pb": 2}],
)

out = dec.decompress(payload)

if zlib.crc32(out) & 0xFFFFFFFF != crc_expected:
    raise SystemExit("CRC mismatch")

pathlib.Path("build/src/ocrad-0.23.tar").write_bytes(out)

执行:

cd /c/Users/www/Desktop/osra-2.2.4
python3 build/decode_lzip.py
tar -xf build/src/ocrad-0.23.tar -C build/src
cd build/src/ocrad-0.23

./configure --prefix=/c/Users/www/Desktop/osra-2.2.4/build/local
make

复制产物:

Copy-Item -Force build\src\ocrad-0.23\ocradlib.h build\local\include\
Copy-Item -Force build\src\ocrad-0.23\libocrad.a build\local\lib\
Copy-Item -Force build\src\ocrad-0.23\ocrad.exe build\local\bin\

查看 OCRAD 版本:

$env:PATH="C:\msys64\ucrt64\bin;C:\msys64\usr\bin;$env:PATH"
.\build\local\bin\ocrad.exe --version

输出:

GNU ocrad 0.23

六、配置 OSRA

回到 OSRA 根目录:

cd /c/Users/www/Desktop/osra-2.2.4

执行配置:

./configure \
  --with-tclap-include=/c/Users/www/Desktop/osra-2.2.4/build/local/include \
  --with-gocr-include=/c/Users/www/Desktop/osra-2.2.4/build/local/include/gocr \
  --with-gocr-lib=/c/Users/www/Desktop/osra-2.2.4/build/local/lib \
  --with-ocrad-include=/c/Users/www/Desktop/osra-2.2.4/build/local/include \
  --with-ocrad-lib=/c/Users/www/Desktop/osra-2.2.4/build/local/lib \
  --with-potrace-include=/ucrt64/include \
  --with-potrace-lib=/ucrt64/lib \
  --with-poppler-include=/ucrt64/include \
  --with-poppler-lib=/ucrt64/lib \
  --with-openbabel-include=/ucrt64/include/openbabel3 \
  --with-openbabel-lib=/ucrt64/lib

配置成功后会提示:

configure: Now you can run "make all install" to compile and install the application.

七、修复 CImg 编译问题

新版 GCC 编译旧版 CImg 时会报错:

cast from 'unsigned char*' to 'long unsigned int' loses precision

解决方式是在 Makefile.inc 中加入 -fpermissive

CXXFLAGS := -g -O2 -fpermissive

然后编译:

make -j2

成功后生成:

src/osra.exe

八、修复 OpenBabel 3.1 下的崩溃问题

运行测试图片时,程序曾在 OpenBabel 创建分子阶段崩溃。原因是 OSRA 的 superatom.txt 中包含:

Xx [*]

OpenBabel 3.1 读取 [*] 时没有生成有效原子,OSRA 后续访问空原子导致崩溃。

src/osra_openbabel.cppcreate_atom() 中增加保护:如果 superatom 解析后原子数为 0,则忽略该 superatom,退回普通 alias atom 处理。

修改后重新编译:

make -j2

九、运行 OSRA

直接运行时需要设置 OpenBabel 插件目录,否则会出现输出为空的问题:

$env:PATH="C:\msys64\ucrt64\bin;C:\msys64\usr\bin;$env:PATH"
$env:BABEL_LIBDIR="C:\msys64\ucrt64\lib\openbabel\3.1.0"
$env:BABEL_DATADIR="C:\msys64\ucrt64\share\openbabel\3.1.0"

运行测试图片:

.\src\osra.exe -l .\dict\spelling.txt -a .\dict\superatom.txt -A .\dict\chain.txt .\test\test.png > result.smi

输出结果示例:

CCCc1nc2c(n1Cc1ccc(cc1)c1ccccc1C(=O)O)cc(cc2C)c1nc2c(n1C)cccc2

十、打包运行环境

为了方便分发,将运行环境整理到 target

target
├─ bin
│  ├─ osra.exe
│  ├─ gocr.exe
│  ├─ ocrad.exe
│  └─ *.dll
├─ dict
│  ├─ spelling.txt
│  ├─ superatom.txt
│  └─ chain.txt
├─ lib
│  ├─ openbabel\3.1.0
│  └─ GraphicsMagick-1.3.47
├─ share
│  └─ openbabel\3.1.0
├─ run-osra.bat
└─ README.txt

run-osra.bat 内容:

@echo off
setlocal

set "OSRA_HOME=%~dp0"
set "PATH=%OSRA_HOME%bin;%PATH%"
set "BABEL_LIBDIR=%OSRA_HOME%lib\openbabel\3.1.0"
set "BABEL_DATADIR=%OSRA_HOME%share\openbabel\3.1.0"
set "MAGICK_CONFIGURE_PATH=%OSRA_HOME%lib\GraphicsMagick-1.3.47\config"
set "MAGICK_CODER_MODULE_PATH=%OSRA_HOME%lib\GraphicsMagick-1.3.47\modules-Q16\coders"
set "MAGICK_FILTER_MODULE_PATH=%OSRA_HOME%lib\GraphicsMagick-1.3.47\modules-Q16\filters"

"%OSRA_HOME%bin\osra.exe" -l "%OSRA_HOME%dict\spelling.txt" -a "%OSRA_HOME%dict\superatom.txt" -A "%OSRA_HOME%dict\chain.txt" %*

使用打包后的版本:

.\target\run-osra.bat .\test\test.png > result.smi

总结

最终在 Windows + MSYS2 UCRT64 下成功编译 OSRA 2.2.4,并完成独立运行环境打包。主要注意点有三个:

1. GCC 临时目录权限问题,需要设置 TMP/TEMP。
2. 旧版 CImg 需要 -fpermissive 才能通过新版 GCC。
3. OpenBabel 必须设置 BABEL_LIBDIR,否则 OSRA 输出会为空。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值