要重新编译过mjpeg-streamer,原先是r63的版本,很老的一个版本,编译的时候因为头文件linux/videodev.h 已经被替代了。
索性就换成最新版本的mjpeg-streamer 好了,反正我是从svn服务器上面下载的。 在xp电脑下,地址是https://svn.code.sf.net/p/mjpg-streamer/code/
最后一个斜杠也不能少哦,少了也不行,我尝试了几次。
不过使用新的mjpg-streamer 也弄出不少问题。
问题一
遵从这篇文章去修改http://lexandros.blog.163.com/blog/static/185566588201272813640474/
因为要指定 libjpeg 的include 路径和 lib路径,自己偷懒,索性在Makefile 中定义了一个变量PATH。
每次执行到uvc_input 里的Makefile时候,总是说CC 或者 arm-linux-gcc 的命令找不到,command not found.
自己也是一头雾水。不过后来别人提点才发现,自己的PATH吧环境变量中的PATH 给替换了,所以才找不到命令。
解决方法也比较简单,将PATH的名字稍微改一下,不要和系统环境变量重名就可以了。
问题二,爆出的错误就是如下
plugins/input_uvc all
make[1]: Entering directory `/home/swchen/code/tools/mjpeg/mjpg-streamer/plugins/input_uvc'
arm-linux-gcc -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I /home/swchen/code/tools/libjpeg/jpeg-install/include -o input_uvc.so input_uvc.c v4l2uvc.lo jpeg_utils.lo dynctrl.lo -ljpeg -L /home/swchen/code/tools/libjpeg/jpeg-install/lib
/home/swchen/enviroment/4.1.2/bin/../lib/gcc/arm-angstrom-linux-gnueabi/4.1.2/../../../../arm-angstrom-linux-gnueabi/bin/ld: v4l2uvc.lo: Relocations in generic ELF (EM: 3)
/home/swchen/enviroment/4.1.2/bin/../lib/gcc/arm-angstrom-linux-gnueabi/4.1.2/../../../../arm-angstrom-linux-gnueabi/bin/ld: v4l2uvc.lo: Relocations in generic ELF (EM: 3)
v4l2uvc.lo: could not read symbols: File in wrong format
collect2: ld returned 1 exit status
make[1]: *** [input_uvc.so] Error 1
make[1]: Leaving directory `/home/swchen/code/tools/mjpeg/mjpg-streamer/plugins/input_uvc'
make: *** [input_uvc.so] Error 2
说的是错误的格式。 但是自己很确定自己在编译libjpeg的使用时交叉编译的,这么说的话libjpeg就不会有问题的。
是在mjpg-streamer这边出了问题,由于问题一的缘故,自己使用了make 和 make CC=arm-linux-gcc 重复了很多次。
所以有部分的生成的文件 是x86下的。 所以才导致了这个问题。
这个只要清空一下就好,make clean -w ,再重新编译,这个问题跳过了。
问题三
make[1]: Entering directory `/home/swchen/code/tools/mjpeg/mjpg-streamer/plugins/input_uvc'
arm-linux-gcc -c -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I /home/swchen/code/tools/libjpeg/jpeg-install/include -o v4l2uvc.lo v4l2uvc.c
arm-linux-gcc -c -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I /home/swchen/code/tools/libjpeg/jpeg-install/include -o jpeg_utils.lo jpeg_utils.c
arm-linux-gcc -c -O1 -DLINUX -D_GNU_SOURCE -Wall -shared -fPIC -I /home/swchen/code/tools/libjpeg/jpeg-install/include -o dynctrl.lo dynctrl.c
dynctrl.c:88: error: ‘V4L2_CID_PAN_RELATIVE’ undeclared here (not in a function)
dynctrl.c:98: error: ‘V4L2_CID_TILT_RELATIVE’ undeclared here (not in a function)
dynctrl.c:108: error: ‘V4L2_CID_PAN_RESET’ undeclared here (not in a function)
dynctrl.c:118: error: ‘V4L2_CID_TILT_RESET’ undeclared here (not in a function)
make[1]: *** [dynctrl.lo] Error 1
make[1]: Leaving directory `/home/swchen/code/tools/mjpeg/mjpg-streamer/plugins/input_uvc'
make: *** [input_uvc.so] Error 2
好端端的又是参数没有定义,这个怎么回事?
后来才了解到时编译器的问题,我用的编译器是4.1.2,而其内部的头文件虽然也包含videodev2.h,内部却不包含这个宏定义。
观看另外一个编译器,4.5.1,里面的videodev2.h 就有包含上述的宏定义。看来得更换编译器了,要不然连编译都过不了。
哈,终于通过了,一个下午时间.....
不过随之而来的是另外一个麻烦,就是illegal instruction。
原先编译器自带的glibc 版本和 后来的glibc版本不对应,而板子上的buybox 等等都是通过4.1.2 编译的。
所以 觉得是交叉编译器混用导致的结果。 要改的东西就多了.....