找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
广告投放联系QQ68610888
查看: 35168|回复: 71

折腾OSCAM之一---OSCAM交叉编译详细步骤

  [复制链接]
发表于 2015-3-21 00:56 | 显示全部楼层 |阅读模式
本帖最后由 兔巴哥 于 2017-12-26 10:36 编辑

有关生成ipk包的方法,请移步这里搞定oscam的ipk打包

声明:本文绝对原创,首发恩山论坛,转帖请注明出处!!!

OSCAM交叉编译流程
写在前面:

有感于网上的高手都不愿意授人以渔,本人经过不懈的努力,参考oscam官网的例子和网上的一些零碎经验,终于成功地交叉编译出oscam,并且在我的联想Y1S路由器上测试通过。

今天我就来授人以渔,希望大神些多加原谅哈!

以下就是我的详细编译步骤和出现错误时的解决办法。这是我初学交叉编译时的一点心得体会,肯定还有更加简洁的方法,分享出来,望大家共同完善。

一、搭建编译环境

1、 安装Ubuntu系统(物理机或者虚拟机)并安装相关软件包,我是安装的ubuntu-14.04.1-desktop-amd64(最好是64位的)。
建议初学者最好是使用虚拟机的方法,操作过程中的复制和粘贴的方便性是不言而喻的。

2、 下载编译oscam需的软件包openssl-1.0.0.tar.gz、libusb-1.0.9.tar.bz2、pcsc-lite-1.8.8.tar.bz2。


3、 在用户主目录下运行svn checkout http://www.streamboard.tv/svn/oscam/trunk oscam,以下载oscam源码。

4、 下载路由器SDK包。之所以要用SDK包而不是只用其中的Toolchain包,是因为后续操作要用到SDK包中的staging_dir目录;并将SDK包解压或者拷贝(或者移动)到/opt/cross目录下(或者/opt/cross/mipsel。当然,你也可以把这个SDK包解压或者拷贝(或者移动)到用户的主目录下。
为简化后续操作的复杂性,还可以将SDK包改名。比如我的路由器的SDK包是OpenWrt-SDK-ramips-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2,其目录结构如下:


改名后如下:
一、 交叉编译OSCAM之前
先介绍几个编译过程可能需要用到的命令和概念

echo $PATH  在linux下查看PATH环境变量

export (***linux下设置环境变量(个人理解),这种设置只对当前登陆的用户(在内存中)立即生效,退出当前用户或者退出终端就失效。如果想一直有效,则需要编辑/etc/profile,或者编辑用户目录下的.bashrc(即:~/.bashrc),然后运行:#source /etc/profile生效,或者重启系统生效。个人认为对于我等小白还是export好点,因为编辑文件涉及到root权限以及编辑命令的使用,一旦编辑错误麻烦不小,不如重新进入终端方便。

make 2>&1 | tee mak.log,产生的编译信息既在屏幕显示,又存一份到文件。比如:
./configure 2>&1 | tee configure.log  
make 2>&1 | tee make.log
make install 2>&1 | tee make-install.log
生成的log文件就在当前目录下,便于查看出错信息。

echo $?  编译完成后,输入echo $? 如果返回结果为0,则表示正常结束,否则就出错了:
编译时(make),往往不知道是否成功编译通过。如果编译没有通过就去make install必然会出错,增加了解决问题的复杂性,通过这种方法检查是否编译成功,然后再考虑下一步的make install。
当然,你也可以不做这一步。

二、 编译特定功能OSCAM的支持组件
        因为默认交叉编译的oscam不支持openssl协议和pcsc以及Smargo读卡器的,所以我们加入支持库。
        为简化屏幕显示的繁杂,我将OpenWrt-SDK-ramips-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2目录重命名为7620

1、 编译openssl/libcrypto
  1. /tmp$ tar -xf openssl-1.0.2.tar.gz
  2. /tmp$ cd openssl-1.0.2
  3. /tmp/openssl-1.0.2$ export TOOLCHAIN=/home/wf/OpenWrt-SDK-ramips-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2
  4. /tmp/openssl-1.0.2$ export PATH="$TOOLCHAIN/bin:$PATH"
  5. /tmp/openssl-1.0.2$ export STAGING_DIR=/home/wf/OpenWrt-SDK-ramips-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2/staging_dir
  6. /tmp/openssl-1.0.2$ export CC=$TOOLCHAIN/bin/mipsel-openwrt-linux-uclibc-gcc
  7. /tmp/openssl-1.0.2$ export RANLIB=$TOOLCHAIN/bin/mipsel-openwrt-linux-uclibc-ranlib
  8. /tmp/openssl-1.0.2$ ./Configure --prefix=$TOOLCHAIN/usr linux-generic32 shared
  9. /tmp/openssl-1.0.2$ make
  10. echo $?
  11. /tmp/openssl-1.0.2$ make install
复制代码

    如果在linux下安装openssl,执行configmake之后,在执行make install时出现类似下面的错误:
cms.pod around line 457: Expected text after =item, not a number
cms.pod around line 461: Expected text after =item, not a number
cms.pod around line 465: Expected text after =item, not a number
cms.pod around line 470: Expected text after =item, not a number
cms.pod around line 474: Expected text after =item, not a number
“POD document had syntax errors at /usr/bin/pod2man line 71.
make: *** [install_docs] 错误 255”

解决方法是:编辑/usr/bin/pod2man文件,注释掉第71行。
千万注意,不要像网上有些说的rm /usr/bin/pod2man,即删除pod2man这个文件,否则安装pcsc组件会出错。

2、 编译libusbpcsc
2-1、libusb
  1. tar -xf libusb-1.0.9.tar.bz2
  2. cd libusb-1.0.9
  3. export TOOLCHAIN=/opt/cross/mipsel/7620/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2
  4. export PATH="$TOOLCHAIN/bin:$PATH"
  5. export STAGING_DIR=/opt/cross/mipsel/7620/staging_dir
  6. ./configure --prefix=$TOOLCHAIN/usr --host=mipsel-openwrt-linux-uclibc (如果显示./config显示未安装libudev-dev,可暂时加--disable-udev通过)。
  7. make
  8. echo $?
  9. /tmp/libusb-1.0.9$ make install
复制代码
如果./config显示未安装libudev-dev,可暂时加上--disable-udev通过,因为在随后编译pcsc时会增加--disable-libudev这一参数,但是我没有这样试过。
而当你去安装sudo apt-get install libusb-dev,可是又报错不能安装,比较完美的解决办法是,更新系统的源为阿里的源。如下操作:
打开源的文件sudo gedit /etc/apt/sources.list
然后替换成下面的内容(如果可以,先备份之前的源sudo cp /etc/apt/source.list /etc/apt/source.list.backup
deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ trusty-backports main restricted universe multiverse

然后sudo apt-get update升级一下再sudo apt-get install libusb-dev即可解决安装的问题。

2-2、pcsc
  1. cd pcsc-lite-1.8.8
  2. export TOOLCHAIN=/opt/cross/mipsel/7620/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2
  3. export PATH="$TOOLCHAIN/bin:$PATH"
  4. export STAGING_DIR=/opt/cross/mipsel/7620/staging_dir
  5. ./configure CC=$TOOLCHAIN/bin/mipsel-openwrt-linux-uclibc-gcc-4.8.3 --disable-libudev --host=mipsel-openwrt-linux-uclibc --prefix=$TOOLCHAIN/usr --exec-prefix=$TOOLCHAIN/usr --disable-shared LIBUSB_LIBS="-L$TOOLCHAIN/usr/lib -lusb-1.0" LIBUSB_CFLAGS="-I$TOOLCHAIN/usr/include/libusb-1.0"
  6. make
  7. echo $?
  8. make install
复制代码
以上过程都顺利的话,在usr目录下会生成如下文件:

四、交叉编译OSCAM
这里只贴出最后一个交叉编译全功能的oscam步骤,其他的可以参考www.streamboard.tv/oscam/wiki/crosscompiling
  1. export TOOLCHAIN=/opt/cross/mipsel/7620/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2
  2. export PATH="$TOOLCHAIN/bin:$PATH"
  3. export STAGING_DIR=/opt/cross/mipsel/7620/staging_dir
复制代码
# Cross compile with static libusb, pcsc, SSL support——交叉编译使用外部usb读卡器、pcsc读卡器、SSL加密支持
  1. make CROSS=$TOOLCHAIN/bin/mipsel-openwrt-linux-uclibc- CONF_DIR=/usr/local/etc/config/ USE_LIBUSB=1 LIBUSB_LIB="$TOOLCHAIN/usr/lib/libusb-1.0.a -lrt" USE_PCSC=1 USE_SSL=1 EXTRA_FLAGS="-I$TOOLCHAIN/usr/include/PCSC"
复制代码
其中CONF_DIR=/usr/local/etc/config/ 是配置文件存放位置,不指定则默认CONF_DIR=/usr/local/etc/

如果这一步出现如下错误:
  1. CC        cscrypt/des.c
  2. In file included from cscrypt/../globals.h:108:0,
  3.                  from cscrypt/des.c:1:
  4. cscrypt/../cscrypt/aes.h:2:27: fatal error: openssl/aes.h: No such file or directory
  5. #  include <openssl/aes.h>
  6.                            ^
  7. compilation terminated.
  8. Makefile:396: recipe for target 'build/mipsel-openwrt-linux-uclibc-ssl/cscrypt/des.o' failed
  9. make[1]: *** [build/mipsel-openwrt-linux-uclibc-ssl/cscrypt/des.o] Error 1
  10. Makefile:348: recipe for target 'all' failed
  11. make: *** [all] Error 2
复制代码
意思是没有找到aes.h这个头文件。但是在/usr/include/ openssl目录中是有这个文件的。
这时可使用命令sudo find / -name aes.h在系统中查找aes.h文件的位置,比如我的查找情况如下:
  1. /media/sf_gx/DSL-2760U_RU_1.04/userspace/public/libs/openssl/crypto/aes/aes.h
  2. /media/sf_gx/DSL-2760U_RU_1.04/userspace/public/libs/openssl/include/openssl/aes.h
  3. /usr/include/openssl/aes.h
  4. /usr/src/linux-headers-3.13.0-46-generic/include/config/crypto/aes.h
  5. ……….
  6. /usr/src/linux-headers-3.13.0-46/include/crypto/aes.h
  7. /home/wf/oscam/cscrypt/aes.h
  8. /opt/cross/mipsel/7620/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7620a/linux-3.10………
复制代码
比照官网的例子可以发现,我们是把组件编译安装在了“usr”目录下,如下:
官网的
  1. make CROSS=$TOOLCHAIN/bin/mipsel-unknown-linux-gnu- CONF_DIR=/etc/tuxbox/config/ USE_LIBUSB=1 LIBUSB_LIB="$TOOLCHAIN/mipsel-unknown-linux-gnu/sys-root/usr/lib/libusb-1.0.a -lrt" USE_PCSC=1 USE_SSL=1 EXTRA_FLAGS="-I$TOOLCHAIN/mipsel-unknown-linux-gnu/sys-root/usr/include/PCSC"
复制代码
我们的
  1. make CROSS=$TOOLCHAIN/bin/mipsel-openwrt-linux-uclibc- CONF_DIR=/usr/local/etc/config/ USE_LIBUSB=1 LIBUSB_LIB="$TOOLCHAIN/usr/lib/libusb-1.0.a -lrt" USE_PCSC=1 USE_SSL=1 EXTRA_FLAGS="-I$TOOLCHAIN/usr/include/PCSC"
复制代码
注意其中的/sys-root/usr/(官网)和/usr/(我们)的区别。

我们使用如下的参数把安装目录(/opt/cross/mipsel/7620/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/usr/include/)的搜索路径指给make
  1. export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:/opt/cross/mipsel/7620/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/usr/include/
复制代码
或者
  1. export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$TOOLCHAIN/usr/include/
复制代码
因为 TOOLCHAIN=/opt/cross/mipsel/7620/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2,下同
  1. export C_INCLUDE_PATH=$C_INCLUDE_PATH:/opt/cross/mipsel/7620/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/usr/include
复制代码
或者
  1. export C_INCLUDE_PATH=$C_INCLUDE_PATH:$TOOLCHAIN/usr/include/
复制代码
至此,就可以顺利的交叉编译出OSCAM。以后如果要编译新的oscam,只做这一步就可以了。如下:
  1. export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$TOOLCHAIN/usr/include/
  2. export C_INCLUDE_PATH=$C_INCLUDE_PATH:$TOOLCHAIN/usr/include/
  3. make CROSS=$TOOLCHAIN/bin/mipsel-openwrt-linux-uclibc- CONF_DIR=/usr/local/etc/config/ USE_LIBUSB=1 LIBUSB_LIB="$TOOLCHAIN/usr/lib/libusb-1.0.a -lrt" USE_PCSC=1 USE_SSL=1 EXTRA_FLAGS="-I$TOOLCHAIN/usr/include/PCSC"
复制代码
另外,编译时出现的set but not used [-Werror=unused-but-set-variable] 问题的解决办法是:
找到对应目录中的Makefile文件,搜索 -Werror 字段,去掉-Werror,重新编译,则问题解决!
不过这只是一个警告,可以不管。

希望大家都可以用上针对自己路由器的oscam插件......

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×

评分

参与人数 6恩山币 +21 收起 理由
prohy + 1 写Makefile,放到openwrt的feeds编译,是不是更简单呢?
唯美的风景 + 10 强大的恩山!(以下重复1万次)
WeDone + 3 强大的恩山!(以下重复1万次)
laoma348 + 5 白富美露出了诧异的眼神:屌丝,你真是太厉害了!
song6229307 + 1 怀揽白富美的屌丝露出了惊讶的眼神:哥,你太帅了!
fgyk + 1 强大的恩山!(以下重复1万次)

查看全部评分

 楼主| 发表于 2015-3-21 01:12 | 显示全部楼层
问题求助,这种方法编译出来的oscam插件是类似“oscam-1.20-unstable_svn10628-mipsel-openwrt-linux-uclibc-ssl-libusb-pcsc”这样的文件,你需要把它改名为oscam,并使用WinSCP上传到路由器的/usr/bin/目录下,改权限为755;并在/usr/local/etc/目录下新建config目录,权限默认(或者755、777);把3个配置文件放在config目录下,权限644。在终端上输入oscam即可启动。
如果要开机启动,最简便的方法就是在openwrt的本地启动脚本中增加oscam即可。

希望,不知道如何将编译出来的oscam打包成ipk文件,这样安装就方便了。望有知道的指点一下。谢谢!

点评

就是啊,支持啊!以前有个老版本的1.0的ipk包,在openwrt AA版上安装可以用,现在BB上不能用了,目录结构变了!只有使用楼主说的方法手动COPY、然后再手动建目录、配置文件,最后是手动写自启动命令!如果系统升级了  详情 回复 发表于 2015-3-23 11:31
回复 支持 反对

使用道具 举报

发表于 2015-3-21 09:00 | 显示全部楼层
高手啊!
回复 支持 反对

使用道具 举报

发表于 2015-3-21 10:22 | 显示全部楼层
高手,感谢分享
回复 支持 反对

使用道具 举报

发表于 2015-3-21 13:24 | 显示全部楼层
把ipk文件用rar解包看一下,再反着来。
回复 支持 反对

使用道具 举报

发表于 2015-3-22 16:49 | 显示全部楼层
支持兔兄    思考了    要能搞定DVN就牛叉了
回复 支持 反对

使用道具 举报

发表于 2015-3-22 18:29 | 显示全部楼层
楼主很屌哇
回复 支持 反对

使用道具 举报

发表于 2015-3-22 21:55 | 显示全部楼层
不错的教程
回复 支持 反对

使用道具 举报

发表于 2015-3-23 11:31 | 显示全部楼层
兔巴哥 发表于 2015-3-21 01:12
问题求助,这种方法编译出来的oscam插件是类似“oscam-1.20-unstable_svn10628-mipsel-openwrt-linux-uclib ...

就是啊,支持啊!以前有个老版本的1.0的ipk包,在openwrt AA版上安装可以用,现在BB上不能用了,目录结构变了!只有使用楼主说的方法手动COPY、然后再手动建目录、配置文件,最后是手动写自启动命令!如果系统升级了,又要重复操作一次,很繁琐!
回复 支持 反对

使用道具 举报

发表于 2015-3-24 01:59 | 显示全部楼层

点评

这个支持哪些芯片的路由器?  详情 回复 发表于 2015-3-25 02:00
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-24 04:02 | 显示全部楼层
楼上的同学能否简单指点一下怎么生成ipk包吗?

点评

http://wiki.openwrt.org/doc/devel/packages  详情 回复 发表于 2015-3-24 18:33
回复 支持 反对

使用道具 举报

发表于 2015-3-24 18:33 | 显示全部楼层
兔巴哥 发表于 2015-3-24 04:02
楼上的同学能否简单指点一下怎么生成ipk包吗?

http://wiki.openwrt.org/doc/devel/packages

点评

同求oscam makefile ,这个问题困扰很久了,还没搞定。谢谢了。  详情 回复 发表于 2015-3-28 01:17
能否分享一下这个Makefile文件,目前还有点看不懂这个文件。 谢谢!  详情 回复 发表于 2015-3-26 21:06
回复 支持 反对

使用道具 举报

发表于 2015-3-25 02:00 | 显示全部楼层
LazyZhu 发表于 2015-3-24 01:59
http://dl.lazyzhu.com/file/openwrt-antigfw/packages/ramips/oscam_1.20-svn-r10641-20150324_ramips_24k ...

这个支持哪些芯片的路由器?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-3-26 21:06 | 显示全部楼层
LazyZhu 发表于 2015-3-24 18:33
http://wiki.openwrt.org/doc/devel/packages

能否分享一下这个Makefile文件,目前还有点看不懂这个文件。
谢谢!
回复 支持 反对

使用道具 举报

发表于 2015-3-28 01:17 | 显示全部楼层
LazyZhu 发表于 2015-3-24 18:33
http://wiki.openwrt.org/doc/devel/packages

同求oscam makefile ,这个问题困扰很久了,还没搞定。谢谢了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

欢迎大家光临恩山无线论坛上一条 /1 下一条

有疑问请添加管理员QQ86788181|手机版|小黑屋|Archiver|恩山无线论坛(常州市恩山计算机开发有限公司版权所有) ( 苏ICP备05084872号 )

GMT+8, 2024-6-16 19:20

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

| 江苏省互联网有害信息举报中心 举报信箱:js12377 | @jischina.com.cn 举报电话:025-88802724 本站不良内容举报信箱:68610888@qq.com

快速回复 返回顶部 返回列表