本帖最后由 兔巴哥 于 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。
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 - /tmp$ tar -xf openssl-1.0.2.tar.gz
- /tmp$ cd openssl-1.0.2
- /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
- /tmp/openssl-1.0.2$ export PATH="$TOOLCHAIN/bin:$PATH"
- /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
- /tmp/openssl-1.0.2$ export CC=$TOOLCHAIN/bin/mipsel-openwrt-linux-uclibc-gcc
- /tmp/openssl-1.0.2$ export RANLIB=$TOOLCHAIN/bin/mipsel-openwrt-linux-uclibc-ranlib
- /tmp/openssl-1.0.2$ ./Configure --prefix=$TOOLCHAIN/usr linux-generic32 shared
- /tmp/openssl-1.0.2$ make
- echo $?
- /tmp/openssl-1.0.2$ make install
复制代码
如果在linux下安装openssl,执行config和make之后,在执行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、 编译libusb和pcsc 2-1、libusb - tar -xf libusb-1.0.9.tar.bz2
- cd libusb-1.0.9
- export TOOLCHAIN=/opt/cross/mipsel/7620/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2
- export PATH="$TOOLCHAIN/bin:$PATH"
- export STAGING_DIR=/opt/cross/mipsel/7620/staging_dir
- ./configure --prefix=$TOOLCHAIN/usr --host=mipsel-openwrt-linux-uclibc (如果显示./config显示未安装libudev-dev,可暂时加--disable-udev通过)。
- make
- echo $?
- /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)
然后sudo apt-get update升级一下再sudo apt-get install libusb-dev即可解决安装的问题。
2-2、pcsc - cd pcsc-lite-1.8.8
- export TOOLCHAIN=/opt/cross/mipsel/7620/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2
- export PATH="$TOOLCHAIN/bin:$PATH"
- export STAGING_DIR=/opt/cross/mipsel/7620/staging_dir
- ./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"
- make
- echo $?
- make install
复制代码以上过程都顺利的话,在usr目录下会生成如下文件:
四、交叉编译OSCAM 这里只贴出最后一个交叉编译全功能的oscam步骤,其他的可以参考www.streamboard.tv/oscam/wiki/crosscompiling - export TOOLCHAIN=/opt/cross/mipsel/7620/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2
- export PATH="$TOOLCHAIN/bin:$PATH"
- export STAGING_DIR=/opt/cross/mipsel/7620/staging_dir
复制代码# Cross compile with static libusb, pcsc, SSL support——交叉编译使用外部usb读卡器、pcsc读卡器、SSL加密支持 - 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/
如果这一步出现如下错误: - CC cscrypt/des.c
- In file included from cscrypt/../globals.h:108:0,
- from cscrypt/des.c:1:
- cscrypt/../cscrypt/aes.h:2:27: fatal error: openssl/aes.h: No such file or directory
- # include <openssl/aes.h>
- ^
- compilation terminated.
- Makefile:396: recipe for target 'build/mipsel-openwrt-linux-uclibc-ssl/cscrypt/des.o' failed
- make[1]: *** [build/mipsel-openwrt-linux-uclibc-ssl/cscrypt/des.o] Error 1
- Makefile:348: recipe for target 'all' failed
- make: *** [all] Error 2
复制代码意思是没有找到aes.h这个头文件。但是在/usr/include/ openssl目录中是有这个文件的。 这时可使用命令sudo find / -name aes.h在系统中查找aes.h文件的位置,比如我的查找情况如下: - /media/sf_gx/DSL-2760U_RU_1.04/userspace/public/libs/openssl/crypto/aes/aes.h
- /media/sf_gx/DSL-2760U_RU_1.04/userspace/public/libs/openssl/include/openssl/aes.h
- /usr/include/openssl/aes.h
- /usr/src/linux-headers-3.13.0-46-generic/include/config/crypto/aes.h
- ……….
- /usr/src/linux-headers-3.13.0-46/include/crypto/aes.h
- /home/wf/oscam/cscrypt/aes.h
- /opt/cross/mipsel/7620/build_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/linux-ramips_mt7620a/linux-3.10………
复制代码比照官网的例子可以发现,我们是把组件编译安装在了“usr”目录下,如下: 官网的 - 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"
复制代码我们的 - 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 - 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/
复制代码或者 - 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,下同 - 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
复制代码或者 - export C_INCLUDE_PATH=$C_INCLUDE_PATH:$TOOLCHAIN/usr/include/
复制代码至此,就可以顺利的交叉编译出OSCAM了。以后如果要编译新的oscam,只做这一步就可以了。如下: - export CPLUS_INCLUDE_PATH=$CPLUS_INCLUDE_PATH:$TOOLCHAIN/usr/include/
- export C_INCLUDE_PATH=$C_INCLUDE_PATH:$TOOLCHAIN/usr/include/
- 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插件......
请不要胡乱输入以及粘贴、复制等方式灌水
请尊重作者、并共同维护网站的正常阅读,否则账户将会被限制发帖、回帖,并且积分可能会被清零,站内短信以及阅读权限等都会受到影响,谢谢。
具体限制方式:https://www.right.com.cn/forum/thread-8307840-1-1.html
|