您的位置:首页 > 运维架构

Openwrt实现Cups打印

2015-11-11 10:06 1111 查看



    相信,如果你真在仔细的阅读本博客,你应该是对openwrt比较熟悉,或者了解,所以在这里我也不做过多的解释,至于cups整个的打印框架在下图中体现出来了,这个图不是我画的,是根据网上的图形,加上我自己做的这个cups打印,进行的绘制,图中某些地方也不完全正确,只是作为一个参考,让你更加明白cups的工作原理。



    下面,我根据自己的理解稍微介绍一下cups的工作流程,最上面的cups server是表示的是从客户端传送给cups的一些打印文件,cups接收到了文件后,调用cups的Postscript解释器,对文件进行解释,然后可能会调用pstops在对解释后的文件进行再次解释。到目前为止都是可以通过cups自身完成的,但是要传送到打印机,除非是那种Postscript打印机可以直接将处理后的文件流传入打印机,否则还需要借助其他的软件进行文件流转换,方能传入打印机。

    上图中,包含有Ghostscript与Pstoraster,二条不同的路线,其实这是一条路线,当时在详细设计中不知怎么画了这样一个图,现在思路要清晰许多,Ghostscript是一个文件格式的转换器,基于Adobe、PostScript及可移植文档格式(PDF)的页面描述语言等而编译成的免费软件,在这里主要用于处理Postscript解释后的文件。Pstoraster是一个脚本,在运行此脚本时,本身需要依赖于Ghostscript才能进行转换,所以他们可以当做是一个东西,当然Ghostscript还可以用于PDF文件转换为Postscript文件,这是airprint需要的东西,这里不做过多的解释。

   我们转送的打印文件到此时已经通过Ghostscript转换为raster文件,此时,就需要用到你使用的是何种PPD文件,如果你使用的PPD文件属于gutenprint的打印方式,则会用到一个叫rastertogutenprint的解释器,这是gutenprint种的东西,相同的Hplip也一样,我们用的就是这种方式进行打印。最后传送到backend中,backend与打印机相连。

   基本原理在这里就说这么多,都是根据我自己的理解进行阐述的,可能存在不妥的地方。

   下面,我们再来总结一下我们需要的东西

(1)cups   (2)Ghostscript (3)Pstoraster(早期的cups版本是存在的,目前已经没有了,可以在网上自己下载一个) (4)gutenprint 或Hplip(再次注意,PPD文件是在编译这二个软件的时候,gutenprint需要制定编译选项,Hplip会直接生成)

    Openwrt官网上就有cups的Makefile直接可以用,这里不做过多的说明,主要还是说明一下Ghostscript的编译。

   其实,网上已经有了几篇关于Ghostscript交叉编译错误及解决方案的问题,部分可以借鉴,但是正对Openwrt的编译平台,还需要做其他的考虑。

问题一 error: libtiff configure scriptfailed

在makefile中,配置选项--with-system-libtiff

问题二error: jbig2dec configurescript failed

在makefile中,添加配置选项--without-jbig2dec 
问题三就是checking for bigendian... configure: error: in `

       这是大小端问题引起的,我的解决方案是,直接在源码Makefile中检查大小端的代码去掉了。

 问题四

./obj/aux/echogs:Command not found

./obj/aux/genconf: Command not found

./obj/aux/genarch: Command not found
这是由于echogs,genconf,genarch不能进行交叉编译,需要修改它的编译方式,在Makefile中将他们的编译方式强制指定为gcc编译。这里不是最终的目标程序,不需要进行交叉编译。

问题五:./obj/aux/mkromfs:/lib/ld-uClibc.so.0: bad ELF interpreter: No such file or directory

这是由于mkromfs_0也不能通过交叉编译,生成出来的mkromfs_0命令无法使用,修改编译方式,并将gcc编译生成的。

问题六:

./obj/jccoefct.c:In function 'compress_data':

./obj/jccoefct.c:153:3:error: 'forward_DCT_ptr' undeclared (first use in this function)

./obj/jccoefct.c:153:3:note: each undeclared identifier is reported only once for each function itappears in

./obj/jccoefct.c:153:19:error: expected ';' before 'forward_DCT'

./obj/jccoefct.c:172:2:error: 'forward_DCT' undeclared (first use in this function)

./obj/jccoefct.c:172:40:error: subscripted value is pointer to function

./obj/jccoefct.c:187:8:warning: implicit declaration of function 'FMEMZERO'

         这也是由于编译jccoefct.c出现问题,所以修改它的编译方式,这里你可以先参照在x86平台下的编译jccoefct.c的选项,对照交叉编译的选项进行修改,去掉交叉编译多出来的编译选项。在以后的编译过程中还会遇到类似的编译问题,jmemmgr.c,jcdctmgr.c,jcarith.c,jcmaster.c,jdcoefct.c,jdinput.c,jdarith.c,jdmarker.c,按照同样的方式修改编译方式。

交叉编译gutenprint

问题一:

gutenprint-5.2.9/src/xml/.libs/lt-extract-strings: /lib/ld-uClibc.so.0:bad ELF interpreter: No such file or directory

主要是由于extract-strings不能进行交叉编译,需要gcc编译。

先说到这里吧!以后有机会再来添加这篇博客,有什么意见或者问题,可以留言向我提出来。 http://m.blog.csdn.net/blog/u011743648/10493757
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息