通过网盘分享的文件: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.cpp 的 create_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 输出会为空。
623

被折叠的 条评论
为什么被折叠?



