在demo的makefile中添加相應(yīng)等的文件就可以了,cpp文件相應(yīng)的SRC,h文件的目錄要被包含進(jìn)去,這樣就餓可以了,靜態(tài)庫(kù)的路徑要是絕對(duì)路徑!!!,這樣就可以變異通過(guò)了。
以S3C6410為例,此時(shí)arm-none-linux-gnueabi-4.3.2已經(jīng)安裝完畢。
首先把和板子上燒寫(xiě)的內(nèi)核同樣的內(nèi)核源碼放置到任意目錄下,如/usr/src/s3c-linux-2.6.28.6-Real6410。(內(nèi)核源碼需要配置,而板子附帶CD上一般是配置好的,在上面修改簡(jiǎn)單一些)
進(jìn)行make或。/build。遇到了報(bào)錯(cuò),找不到XX文件。查看了一下,指定目錄下是有這個(gè)文件的。make clean再進(jìn)行。/build就行了。
在需要編譯的目標(biāo)代碼目錄下編寫(xiě)makefile文件,內(nèi)容如下:
ARCH:= arm
CC:= $(CROSS_COMPILE)gcc
LD:= $(CROSS_COMPILE)ld
obj-m := udpcli.o
KERNELDIR := /usr/src/s3c-linux-2.6.28.6-Real6410
PWD := $(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -f *.o
rm -f *.symvers
rm -f *.order
rm -f *.ko
rm -f *.mod.c
如果你在瀏覽github的時(shí)候發(fā)現(xiàn)一個(gè)很好的Linux c語(yǔ)言程序,在桌面平臺(tái)編譯一下發(fā)現(xiàn)很好用,這時(shí)你想把它移植到OpenWrt平臺(tái)上放到路由器上使用,那么要是能把它編譯成ipk文件直接安裝到路由器上就好了。下面就以redsocks2這款軟件為例來(lái)介紹使用Ubuntu交叉編譯redsocks2 ipk安裝包的Makefile寫(xiě)法
選擇Redsocks2作為例子的原因是redsocks這個(gè)程序只需運(yùn)行一行make就可以開(kāi)始執(zhí)行編譯,沒(méi)有復(fù)雜的編譯時(shí)配置,并且編譯完成之后會(huì)生成一個(gè)名為redsocks2的可執(zhí)行文件,把這個(gè)文件拷貝出來(lái)到磁盤(pán)的其他地方都可以運(yùn)行。也就是說(shuō),redsocks2是一個(gè)編譯起來(lái)非常容易的程序。編譯完成只需獲得一個(gè)可執(zhí)行文件就可以開(kāi)始用了。
下面先在Ubuntu16.04系統(tǒng)上觀察它的編譯過(guò)程
首先我們從github上克隆redsocks2的源碼
[plain] view plain copygit clone https://github.com/semigodking/redsocks.git
克隆結(jié)束之后安裝一個(gè)依賴(lài)庫(kù)libevent2,不然編譯的時(shí)候會(huì)報(bào)錯(cuò)“fatal error: event2/event.h: 沒(méi)有那個(gè)文件或目錄”
sudo apt-get install libevent-dev
然后觀察一下現(xiàn)在的redsocks2目錄
然后執(zhí)行make,gcc就開(kāi)始編譯了,編譯完成后再觀察這個(gè)目錄,就會(huì)發(fā)現(xiàn)多出一個(gè)redsocks2的可執(zhí)行文件,我們就可以把這個(gè)可執(zhí)行文件拷貝出來(lái)然后運(yùn)行使用了
在Ubuntu上很簡(jiǎn)單的就編譯完成了redsocks2,那么在OpenWrt的SDK上如何編譯成ipk呢
首先先下載OpenWrt的SDK,這里也WNDR4300路由器為例
下載完畢之后使用
tar xjf OpenWrt-SDK-ar71xx-for-linux-x86_64-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2
?
解壓這個(gè)tar包,之后進(jìn)入SDK的主目錄,在package目錄下新建一個(gè)名為redsocks2的目錄,然后開(kāi)始新建一個(gè)Makefile文件,內(nèi)容如下
include $(TOPDIR)/rules.mk
PKG_NAME:=redsocks2
PKG_VERSION:=0.66
PKG_RELEASE:=1
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/semigodking/redsocks.git
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE_VERSION:=bc2706a331c04a76df428748da97a7d4b5fa1754
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
PKG_MAINTAINER:=semigodking 《semigodking@gmail.com》
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)/$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
include $(INCLUDE_DIR)/package.mk
define Package/redsocks2
SECTION:=net
CATEGORY:=Network
TITLE:=Redirect any TCP connection to a SOCKS or HTTPS proxy server
URL:=https://github.com/semigodking/redsocks
DEPENDS:=+libevent2 +libopenssl
endef
define Package/redsocks2/description
This is a modified version of original redsocks. \
The name is changed to be REDSOCKS2 since this release to distinguish with original redsocks. \
This variant is useful for anti-GFW (***)。
endef
define Package/redsocks2/conffiles
/etc/config/redsocks2
endef
define Package/redsocks2/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/redsocks2 $(1)/usr/bin
$(INSTALL_DIR) $(1)/etc/redsocks2
$(INSTALL_DATA) 。/files/redsocks2.template $(1)/etc/redsocks2/config.template
endef
$(eval $(call BuildPackage,redsocks2))
下面簡(jiǎn)單的解釋一下
第一行 include $(TOPDIR)/rules.mk 是固定寫(xiě)法,不論是luci還是可執(zhí)行文件的Makefile,第一行都是它
PKG_NAME:=redsocks2
PKG_VERSION:=0.66
PKG_RELEASE:=1
這三行代表你打包出的ipk的軟件名,版本,PKG_RELEASE是發(fā)布號(hào),一般是1,2,3等。其中PKG_NAME用于給其他的軟件包安裝時(shí)檢查依賴(lài)用,PKG_VERSION在升級(jí)ipk的時(shí)候有用,比如你要用一個(gè)舊版ipk替換新版ipk,默認(rèn)是不可以的,而新版替換舊版就沒(méi)什么問(wèn)題
PKG_SOURCE_PROTO:=git
PKG_SOURCE_URL:=https://github.com/semigodking/redsocks.git
PKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)
PKG_SOURCE_VERSION:=bc2706a331c04a76df428748da97a7d4b5fa1754
PKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(PKG_SOURCE_VERSION).tar.gz
上面這幾行標(biāo)識(shí)出源代碼應(yīng)該從哪里下載,
PKG_SOURCE_PROTO指出是git還是svn,
PKG_SOURCE_URL指出git倉(cāng)庫(kù)下載的地址。
PKG_SOURCE_SUBDIR指出git應(yīng)該將源代碼克隆到什么位置。
PKG_SOURCE_VERSION指出應(yīng)該克隆哪個(gè)版本,由commit號(hào)決定,有了它你就可以直接編譯最新版的ipk安裝包或者編譯舊版本的安裝包,非常實(shí)用
PKG_SOURCE 這個(gè)我也不是很清楚是做什么的
PKG_MAINTAINER:=semigodking 《semigodking@gmail.com》
PKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)/$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)
PKG_MAINTAINER 后面寫(xiě)作者的郵箱,比較隨意,不影響編譯
PKG_BUILD_DIR代表編譯目錄,也就是在哪里編譯源碼,目錄內(nèi)容和我上面Ubuntu截圖的那個(gè)目錄是一樣的,這里寫(xiě)錯(cuò)了會(huì)無(wú)法編譯,報(bào)錯(cuò)找不到目錄。同理編譯完成后生成的可執(zhí)行文件也要到這個(gè)目錄里面去找
include $(INCLUDE_DIR)/package.mk 這一行是固定寫(xiě)法
define Package/redsocks2
SECTION:=net
CATEGORY:=Network
TITLE:=Redirect any TCP connection to a SOCKS or HTTPS proxy server
URL:=https://github.com/semigodking/redsocks
DEPENDS:=+libevent2 +libopenssl
endef
上面這些是定義應(yīng)該編譯什么ipk包,可以寫(xiě)好幾個(gè)define,由于這個(gè)的redsocks2之編譯openssl一個(gè)版本所以就寫(xiě)了一個(gè),如果想要編譯polarSSL版本需要再寫(xiě)一個(gè)define
上面的redsocks2就是顯示在make menuconfig中的包名
SECTION指的是在make menuconfig中該ipk包應(yīng)該被放在哪個(gè)父目錄下
TITLE是make menuconfig中的標(biāo)題說(shuō)明
URL指的是URL說(shuō)明
DEPENDS這一行比較關(guān)鍵,這個(gè)規(guī)定了編譯時(shí)的依賴(lài)庫(kù),同時(shí)也表明出安裝時(shí)的依賴(lài)庫(kù),如果這里依賴(lài)庫(kù)填寫(xiě)少了,比如缺少+libevent2這個(gè)庫(kù),那么編譯時(shí)就會(huì)報(bào)出缺少event.o這個(gè)文件,編譯就會(huì)失敗,同時(shí)如果在向openwrt安裝redsocks的ipk時(shí),如果沒(méi)有安裝libevent2.ipk,那么redsocks2的ipk也不會(huì)安裝成功,提示缺少依賴(lài)庫(kù)libevnet2。
注:如果在安裝過(guò)程中,實(shí)現(xiàn)使用了opkg update并聯(lián)網(wǎng)安裝redsocks2的ipk,openwrt會(huì)自動(dòng)聯(lián)網(wǎng)其所需要的依賴(lài)庫(kù)。使用ImageBuilder打包固件時(shí)也會(huì)如此。
define Package/redsocks2/description
This is a modified version of original redsocks. \
The name is changed to be REDSOCKS2 since this release to distinguish with original redsocks. \
This variant is useful for anti-GFW (***)。
endef
這一段指出了在make menuconfig時(shí)候顯示的軟件描述信息,不影響編譯
define Package/redsocks2/conffiles
/etc/config/redsocks2
endef
指出了該軟件包的配置文件位置,作用不大,不影響編譯
define Package/redsocks2/install
$(INSTALL_DIR) $(1)/usr/bin
$(INSTALL_BIN) $(PKG_BUILD_DIR)/redsocks2 $(1)/usr/bin
$(INSTALL_DIR) $(1)/etc/redsocks2
$(INSTALL_DATA) 。/files/redsocks2.template $(1)/etc/redsocks2/config.template
endef
這一段非常重要,它詳細(xì)的列出了梅雨個(gè)編譯后生成的文件的安裝位置,比如上一段前兩行標(biāo)識(shí)將編譯路下的redsocks2文件安裝到/uer/bin目錄下
后兩行表示將files(提前放在package/redsocks目錄下)目錄下的redsocks2.template文件(該文件為你自己寫(xiě)的隨便一個(gè)文件)安裝到/etc/redsocks2目錄下并改名為config.template
同時(shí),原版redsocks目錄下的文件也可以在這里規(guī)定安裝到哪去,比如下面兩句
$(INSTALL_DIR) $(1)/etc/
$(INSTALL_DATA) $(PKG_BUILD_DIR)/redsocks.conf.example $(1)/etc/redsocks2.conf.example
就是把編譯目錄下的redsocks.conf.example文件(該文件是github上原作者自己制作的文件,和上面那個(gè)不一樣)安裝到/etc/目錄下
最后一行$(eval $(call BuildPackage,redsocks2))是固定寫(xiě)法
有了這個(gè)Makefile文件之后,我們就不需要把github上的源碼克隆到本地,因?yàn)镾DK在執(zhí)行Makefile文件的時(shí)候會(huì)自動(dòng)幫我們?nèi)ネ瓿蛇@寫(xiě)操作。需要我們做的就是將該Makefile放到/package/redsocks2目錄下,然后在SDK目錄執(zhí)行make menuconfig,選擇redsocks2為M模式,然后執(zhí)行
make package/redsocks2/compile V=99
就可以在SDK目錄/bin/ar71xx下面獲得一個(gè)ipk包了
這里有一個(gè)我寫(xiě)好的現(xiàn)成可以直接用的目前最新版redsocks2 ipk編譯文件,有需要的可以直接用SDK編譯:https://github.com/AlexZhuo/openwrt-redsocks2
除了使用Makefile打包ipk之外,也可以用SDK直接交叉編譯出OpenWrt所使用的程序,方法略麻煩,是redsocks2作者提供的方法。這個(gè)需要根據(jù)CPU的不同設(shè)置不同的環(huán)境變量,找來(lái)找去也聽(tīng)麻煩的,比如ar71xx可以用如下方法配置環(huán)境變量然后編譯
export PATH=$PATH:/home/alex/Downloads/OpenWrt-SDK-15.05.1-ar71xx-nand_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/
export STAGING_DIR=/home/alex/Downloads/OpenWrt-SDK-15.05.1-ar71xx-nand_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/staging_dir/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/
export CFLAGS=“-I/home/alex/Downloads/OpenWrt-SDK-15.05.1-ar71xx-nand_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/staging_dir/target-mips_34kc_uClibc-0.9.33.2/usr/include/ -L/home/alex/Downloads/OpenWrt-SDK-15.05.1-ar71xx-nand_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/staging_dir/target-mips_34kc_uClibc-0.9.33.2/usr/lib/”
make CC=mipsel-openwrt-linux-gcc LD=mipsel-openwrt-linux-ld
同理,如果想要編譯ramips CPU的話(huà)只需要修改上面環(huán)境變量的目錄即可
export PATH=$PATH:/home/alex/OP_SDK/OpenWrt-SDK-15.05.1-ramips-rt305x_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/bin/
export STAGING_DIR=/store/build/openwrt/staging_dir/toolchain-mipsel_24kec+dsp_gcc-4.8-linaro_uClibc-0.9.33.2/
export CFLAGS=“-I/home/alex/OP_SDK/OpenWrt-SDK-15.05.1-ramips-rt305x_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/usr/include/ -L/home/alex/OP_SDK/OpenWrt-SDK-15.05.1-ramips-rt305x_gcc-4.8-linaro_uClibc-0.9.33.2.Linux-x86_64/staging_dir/target-mipsel_24kec+dsp_uClibc-0.9.33.2/usr/lib/”
make CC=mipsel-openwrt-linux-uclibc-gcc LD=mipsel-openwrt-linux-uclibc-ld
使用這種方法我們只能編譯出一個(gè)redsocks2的可執(zhí)行文件,可以通過(guò)scp上傳到路由器上使用,但是沒(méi)有了ipk的安裝過(guò)程,系統(tǒng)也就不認(rèn)為你安裝了一個(gè)名字叫redsocks2的組件,如果由其他依賴(lài)包依賴(lài)redsocks2的話(huà),還是會(huì)報(bào)錯(cuò)。所以ipk安裝的方式更好一些
評(píng)論