我目前正在尝试使现有项目静态链接到其主要依赖项,以减少生成的输出库的大小。我要更改的项目是 Tesseract OCR,它依赖于 Leptonica 图像处理库。
目前,Leptonica 统计了 2481 个函数,但 Tesseract 只使用了其中的 163 个。换句话说,Tesseract 中仅使用了 6.6% 的 Leptonica 功能,但整个代码(3.5 MB + 附加库)将被加载并保存在内存中。对于桌面系统来说,这可能根本不是问题。但是在内存有限的移动设备上,未使用的代码占用几 MB 的成本太高了。
我希望使用静态链接来减小这对 Tesseract+Leptonica 的整体大小。这两个项目都使用 autoconfig/automake/libtool 构建系统。
Leptonica 的构建生成静态和动态库。Tesseract 在其 configure.ac 中使用以下行来声明 Leptonica 依赖项:
AC_CHECK_LIB(lept,pixCreate,[],AC_MSG_ERROR([Leptonica library missing]))
因为上述行确实将 Leptonica 自动添加到 $LIBS,所以我将其更改如下:
AC_CHECK_LIB(lept,pixCreate,[LIBS="-Bstatic -llept -Bdynamic $LIBS"],AC_MSG_ERROR([Leptonica library missing])))
当我运行 ./configure 和 make 时,一切正常,但 Tesseract 仍将动态链接到 Leptonica。
在检查相应的 make 日志时,我注意到 g++ 链接调用只是忽略了我的“-Bstatic”属性并链接到共享库 (liblept.so):
libtool: link: g++ -m32 -fPIC -DPIC -shared -nostdlib /usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/crti.o /usr/lib/gcc/i686-linux-gnu/4.8/crtbeginS.o -Wl,--whole-archive ./.libs/libtesseract_api.a ../ccmain/.libs/libtesseract_main.a ../cube/.libs/libtesseract_cube.a ../neural_networks/runtime/.libs/libtesseract_neural.a ../textord/.libs/libtesseract_textord.a ../wordrec/.libs/libtesseract_wordrec.a ../classify/.libs/libtesseract_classify.a ../dict/.libs/libtesseract_dict.a ../ccstruct/.libs/libtesseract_ccstruct.a ../cutil/.libs/libtesseract_cutil.a ../viewer/.libs/libtesseract_viewer.a ../ccutil/.libs/libtesseract_ccutil.a ../opencl/.libs/libtesseract_opencl.a -Wl,--no-whole-archive -Wl,-rpath -Wl,/home/maxpol/Dokumente/javacpp-presets-myfork/tesseract/cppbuild/linux-x86/lib -Wl,-rpath -Wl,/home/maxpol/Dokumente/javacpp-presets-myfork/tesseract/cppbuild/linux-x86/lib -L/home/maxpol/Dokumente/javacpp-presets-myfork/tesseract/cppbuild/linux-x86/lib/ -lz /home/maxpol/Dokumente/javacpp-presets-myfork/tesseract/cppbuild/linux-x86/lib/liblept.so -lpthread -L/usr/lib/gcc/i686-linux-gnu/4.8 -L/usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu -L/usr/lib/gcc/i686-linux-gnu/4.8/../../../../lib -L/lib/i386-linux-gnu -L/lib/../lib -L/usr/lib/i386-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/i686-linux-gnu/4.8/../../.. -lstdc++ -lm -lc -lgcc_s /usr/lib/gcc/i686-linux-gnu/4.8/crtendS.o /usr/lib/gcc/i686-linux-gnu/4.8/../../../i386-linux-gnu/crtn.o -m32 -pthread -Wl,-soname -Wl,libtesseract.so.3 -o .libs/libtesseract.so.3.0.4
我已经查阅了 autotools 文档和其他几个项目,但找不到任何有用的东西。因此,我决定自己在这里问这个问题。
我错过了什么重要的东西吗?
非常感谢您的帮助!最好的问候马克斯