Linux应用程序开发(一)---移植thttpd+Sqlite3+PHP5到arm linux(1)

Linux应用程序开发(一)---移植thttpd+Sqlite3+PHP5到arm linux(1)  

移植环境(红色粗字体字修改后内容,蓝色粗体字为特别注意内容)

1,主机环境:VMare下CentOS 5.5 ,1G内存。

2,集成开发环境:Elipse IDE

3,编译编译环境:arm-linux-gcc v4.4.3,arm-none-linux-gn?i-gcc v4.5.1。

4,开发板:mini2440,2M nor flash,128M nand flash。

5,u-boot版本:u-boot-2009.08

6,linux 版本:linux-2.6.32.2

7,参考文章:

移植thttpd Web服务器到ARM-Linux系统

深入研究嵌入式web服务器的视频监控应用

轻量型thttpd+php5

Cross compiling thttpd-2.21b + php-5.2.1

名词解释

Thtttpd:

Thttpd是一个小巧的轻量级web server,它简单结构,提供了CGI和php模块支持,且thttpd 对于并发请求不使用fork()来派生子进程处理,而是采用多路复用(Multiplex)技术来实现,效能更好。
Thttpd支持多种平台,如FreeBSD, SunOS, Solaris, BSD, Linux, OSF等。对于小型web server而言,速度快似乎是一个代名词,通过官方站提供的Benchmark,可以这样认为:thttpd至少和主流的web server一样快,在高负载下更快,因为其资源占用小的缘故。
Thttpd基于URL的文件流量限制,对于下载的流量控制而言是非常方便的。比Apache使用插件效率要高得多。

自PHP5后,php本身自带SQLite数据库操作类,非常之方便。就连创建数据库表你就不用担心,只需要执行sqlite_open()函数,就会在脚本的指定目录创建数据库文件,非常之方便。

CGI:

CGI(公共网关接口)定义了web服务器与外部内容生成程序之间交互的方法,通常是指CGI程序或者CGI脚本,它是在网站上实现动态页面的最简单和常用的方法。详情请参见通用网关接口

HPH:

PHP,是英文超级文本预处理语言Hypertext Preprocessor的缩写。PHP 是一种 HTML 内嵌式的语言,是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,被广泛的运用。详情请参考PHP语言简介

SQLite:

SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。详情请参考SQLite数据库简介

 

安装之前准备

(1)修改u-boot引导参数从nfs引导启动

我之前挂载的是开发板上nand flash的yaffs为根文件系统,为测试方便,现更改为nfs引导,操作如下:

[u-boot@MINI2440]#printenv

... ...

bootargs=noinitrd console=ttySAC0,115200 init=/linuxrc mem=64M root=/dev/mtdbloc
k3 rw rootfstype=yaffs ip=10.1.0.129:10.1.0.128:10.1.0.1:255.255.255.0::eth0:off


Environment size: 447/131068 bytes
[u-boot@MINI2440]# setenv bootargs 'noinitrd console=ttySAC0,115200 init=/linuxr
c mem=64M root=/dev/nfs rw nfsroot=10.1.0.128:/nfsboot/rootfs ip=10.1.0.129:10.1
.0.128:10.1.0.1:255.255.255.0::eth0:off'
[u-boot@MINI2440]# saveenv
Saving Environment to NAND...
Erasing Nand...
Erasing at 0x4000000000002 --   0% complete.
Writing to Nand... done
[u-boot@MINI2440]#

然后重启开发板。

(2)创建用户
切换到开发板的串口终端执行

[root@mini2440 /]#addgroup -g 111 www  //111表示组ID,www表示组名
[root@mini2440 /]#adduser -g 111 www //www表示用户名,111用户名所在的组ID
adduser: group name 'www' is in use
[root@mini2440 /]#adduser -G gwww www
Changing password for www
New password:
Bad password: similar to username
Retype password:
Password for www changed by root
[root@mini2440 /]#

(3)建立安装目录

在配置编译之前,要先建立安装所需要的目录

[root@localhost php-5.2.11]# mkdir /nfsboot/rootfs/usr/local

PHP的编译选项中有--with-thttpd 和 --with-sqlite 选项 ,编译php需要其头文件和库文件,所以编译php之前应先编译thttpd和SQLite。

1,安装Thttpd

【1】下载Thttpd源码

thttpd-2.25b.tar.gz源码:http://www.acme.com/software/thttpd/

下载后解压

[root@localhost linux-test]# ls

thttpd-2.25b.tar.gz
解压thttpd-2.25b.tar.gz

[root@localhost linux-test]# tar -zxvf thttpd-2.25b.tar.gz

建立安装目录

在配置编译之前,要先建立安装所需要的目录

[root@localhost php-5.2.11]# mkdir /nfsboot/rootfs/usr/local
[root@localhost php-5.2.11]#

【2】交叉编译安装

[root@localhost linux-test]# cd thttpd-2.25b
[root@localhost thttpd-2.25b]# CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/nfsboot/rootfs/usr/local
[root@localhost thttpd-2.25b]# make
[root@localhost thttpd-2.25b]# make install
提示错误:chgrp: 无效的组名称‘‘www’’
解决的办法是:在终端中创建这个组,然后

[root@localhost thttpd-2.25b]# make install
出现错误:

cp: 无法创建一般文件“/usr/local/man/man1/makeweb.1”: 没有那个文件或目录
make[1]: *** [install] 错误 1

解决的办法是:在{$prefix}/usr/local/man/目录下手动创建man1目录

[root@localhost thttpd-2.25b]# mkdir /nfsboot/rootfs/usr/local/man/man1
[root@localhost thttpd-2.25b]#
[root@localhost thttpd-2.25b]# make install
OK,安装成功。

【3】去掉相关可执行文件调试信息
[root@localhost local]# arm-linux-strip sbin/*
/usr/local/arm/4.4.3/bin/.arm-none-linux-gn?i-strip:sbin/syslogtocern: File format not recognized

[root@localhost local]# file sbin/*
sbin/htpasswd:     ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.32, statically linked, for GNU/Linux 2.6.32, stripped
sbin/makeweb:      setgid ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.32, dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped
sbin/syslogtocern: Bourne shell script text executable
sbin/thttpd:       ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.32, dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped
[root@localhost local]#

[root@localhost local]# arm-linux-strip www/cgi-bin/*
[root@localhost local]# file www/cgi-bin/*
www/cgi-bin/phf:      ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.32, statically linked, for GNU/Linux 2.6.32, stripped
www/cgi-bin/redirect: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.32, statically linked, for GNU/Linux 2.6.32, stripped
www/cgi-bin/ssi:      ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.32, statically linked, for GNU/Linux 2.6.32, stripped

【4】复制配置文件thttpd.conf

复制配置文件到开发板/etc目录下
[root@localhost thttpd-2.25b]# cp contrib/redhat-rpm/thttpd.conf /nfsboot/rootfs/etc
[root@localhost thttpd-2.25b]#

设置thttpd.conf中默认的服务目录dir=/home/www/html

所以这里在开发板运行的目录建立相应目录

[root@localhost thttpd-2.25b]# mkdir /nfsboot/rootfs/home/www 
[root@localhost thttpd-2.25b]# mkdir /nfsboot/rootfs/home/www/html  //测试网页所在目录
[root@localhost thttpd-2.25b]#

【5】 拷贝测试网页到thttpd服务的根目录(可选,测试之用):

[root@localhost thttpd-2.25b]# cp index.html /nfsboot/rootfs/home/www/html
[root@localhost thttpd-2.25b]#

【6】 查看一下需要的动态库

[root@localhost thttpd-2.25b]# file /nfsboot/rootfs/usr/local/sbin/thttpd
/nfsboot/rootfs/usr/local/sbin/thttpd: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), for GNU/Linux 2.6.9, not stripped
[root@localhost thttpd-2.25b]#

参考文章 http://www.jollen.org/blog/2006/10/library_dependency_1.html

要确保arm-linux运行库中有下列库文件:

[root@localhost thttpd-2.25b]# ls /nfsboot/rootfs/lib
firmware                libmad.so.0.2.1        libpthread.so.0
ld-2.9.so               libmemusage.so         libresolv-2.9.so
ld-linux.so.3           libm.so.6              libresolv.so.2
libanl-2.9.so           libnsl-2.9.so          librt-2.9.so
libanl.so.1             libnsl.so.1            librt.so.1
libBrokenLocale-2.9.so  libnss_compat-2.9.so   libSegFault.so
libBrokenLocale.so.1    libnss_compat.so.2     libstdc++.so
libc-2.9.so             libnss_dns-2.9.so      libstdc++.so.6
libcrypt-2.9.so         libnss_dns.so.2        libstdc++.so.6.0.13
libcrypt.so.1           libnss_files-2.9.so    libthread_db-1.0.so
libc.so.6               libnss_files.so.2      libthread_db.so.1
libdl-2.9.so            libnss_hesiod-2.9.so   libusb-0.1.so.4
libdl.so.2              libnss_hesiod.so.2     libusb-0.1.so.4.4.4
libgcc_s.so             libnss_nis-2.9.so      libusbpp-0.1.so.4
libgcc_s.so.1           libnss_nisplus-2.9.so  libusbpp-0.1.so.4.4.4
libid3tag.so            libnss_nisplus.so.2    libusbpp.so
libid3tag.so.0          libnss_nis.so.2        libusb.so
libid3tag.so.0.3.0      libpcprofile.so        libutil-2.9.so
libiw.so.29             libpng12.so            libutil.so.1
libjpeg.so              libpng12.so.0          libuuid.so
libjpeg.so.62           libpng12.so.0.35.0     libuuid.so.1
libjpeg.so.62.0.0       libpng.so              libuuid.so.1.2
libm-2.9.so             libpng.so.3            modules
libmad.so               libpng.so.3.35.0
libmad.so.0             libpthread-2.9.so
[root@localhost thttpd-2.25b]#

上面蓝色粗体部分信息 Intel 80386 本应该显示arm体系架构ARM 这里却显示Intel 80386 。打开此目录下的Makefile,定位到50行附近,修改如下:

# You shouldn't need to edit anything below here.

CC =  arm-linux-gcc
CCOPT =  -O2

打开cgr-src/Makefile,定位到34行,修改如下:

CGIBINDIR = $(WEBDIR)/cgi-bin
MANDIR = ${prefix}/man

CC =  arm-linux-gcc
CCOPT =  -O2

打开extras/Makefile,定位到35行,修改如下:

MANDIR = ${prefix}/man

CC =  arm-linux-gcc
CCOPT =  -O2

然后保存重新执行

[root@localhost thttpd-2.25b]# make clean

[root@localhost thttpd-2.25b]# make
for i in cgi-src extras ; do ( \
            cd $i ; \
            pwd ; \
            make  \
                WEBDIR=/nfsboot/rootfs/usr/local/www \
                CGIBINDIR=/nfsboot/rootfs/usr/local/www/cgi-bin \
                MANDIR=/nfsboot/rootfs/usr/local/man \
                WEBGROUP=www \
        ) ; done
... ...
[root@localhost thttpd-2.25b]# make install

之后再看下

[root@localhost thttpd-2.25b]# file thttpd
thttpd: ELF 32-bit LSB executable, ARM, version 1 (SYSV), for GNU/Linux 2.6.32, dynamically linked (uses shared libs), for GNU/Linux 2.6.32, not stripped
这此显示的是要运行的平台信息。


【7】增加对CGI的支持

默认配置下,thttpd不可以运行GCI(特别是动态编译的CGI程序)要想使用CGI支持功能,必须更改thttpd.conf的配置,不过在更改之前,要使之能写。

[root@localhost thttpd-2.25b]# chmod a+w /nfsboot/rootfs/etc/thttpd.conf
[root@localhost thttpd-2.25b]#
下面是thttpd.conf修改后的内容:

# This section overrides defaults
dir=/home/www/html 
#web服务器网页路径
#chroot
#屏蔽chroot是为了运行动态编译的CGI
user=www #httpd# default = nobody
#这里user改成自己在开发板建立的用户www
logfile=/var/log/thttpd.log
pidfile=/var/run/thttpd.pid
# This section _documents_ defaults in effect
port=80
#port参数用于更改端口号(可不改,若还运行了别的WEB服务器,则需用不同端口)
# nosymlink# default = !chroot
# novhost
cgipat=/cgi-bin/*
#声明CGI程序的目录,是以dir为根目录的路径
# nothrottles
# host=0.0.0.0
# charset=iso-8859-1

【8】运行测试

当开发板启动并登陆到控制台后,在命令行输入

[root@mini2440 /]#thttpd -C /etc/thttpd.conf
/sbin/thttpd: line 1: syntax error: "(" unexpected
[root@mini2440 /]#

原来之前曾复制到/usr/sbin目录下的出现被编译80386体系架构的thttpd文件没有被删除。删除之后再次运行:

[root@mini2440 /]# /usr/local/sbin/thttpd -V
thttpd/2.25b 29dec2003
[root@mini2440 /]#

OK,运行成功!

现在启动thttpd服务

[root@mini2440 /]# /usr/local/sbin/thttpd -C /etc/thttpd.conf
/var/log/thttpd.log: No s h file or directory
[root@mini2440 /]#

建立日志文件

[root@localhost rootfs]# cd var
[root@localhost var]# mkdir log
[root@localhost var]# cd log
[root@localhost log]# ls
[root@localhost log]# to h thttpd.log
[root@localhost log]# ls
thttpd.log
[root@localhost log]#

再次运行

[root@mini2440 /]# /usr/local/sbin/thttpd  -C /etc/thttpd.conf
[root@mini2440 /]#

thttpd服务成功启动。

在本地终端测试一下

[root@mini2440 /]#wget http://10.1.0.129
Connecting to 10.1.0.129 (10.1.0.129:80)
index.html           100% |*******************************|   311  --:--:-- ETA

然后主机浏览器中访问开发板IP:http://10.1.0.129/

thttpd is running

Looks like you got it working. Congrats.

Here's a link to the thttpd web pages.

2,安装SQLite

参考文章嵌入式数据库sqlite3在arm-linux下的交叉编译

【1】下载SQLite源码

thttpd-2.25b.tar.gz源码
sqlite-autoconf-3070701.tar.gz源码:http://www.sqlite.org/download.html

【2】解压源码

[root@localhost linux-test]# tar -zxvf sqlite-autoconf-3070701.tar.gz

【3】编译配置

[root@localhost linux-test]# cd sqlite-autoconf-3070701
[root@localhost sqlite-autoconf-3070701]# CC=arm-linux-gcc ./configure --host=arm-linux --prefix=/nfsboot/rootfs/usr/local
[root@localhost sqlite-autoconf-3070701]# make
[root@localhost sqlite-autoconf-3070701]# make install
下面步骤参考文章S3C2410下嵌入式数据库SQLite的移植

【4】在开发板控制终端的/usr/sbin建立到/usr/local/bin 的软连接

[root@mini2440 /sbin]#ln -s /usr/local/bin/sqlite3 sqlite3

[root@mini2440 /sbin]#sqlite3 -V
sqlite3: error while loading shared libraries: libsqlite3.so.0: cannot open shar
ed object file: No s h file or directory

还需要设置环境变量,这里sqlite3的库文件在ARM板上的 /usr/local/lib目录下,这里设置环境就像下面:

打开/etc/profile

[root@mini2440 /]#vi /etc/profile

在文件末尾处加入如下变量

#Ash profile
#vim:syntax=sh
#No core file by defaults
#ulimit -S -c 0>/dev/null 2>&1
USER="id -un"
LOGNAME=$USER
PS1='[\u@\h \W]\$'
PATH=$PATH
HOSTNAME='/bin/hostname'
export USER LOGNAME PS1 PATH
export LD_LIBRARY_PATH=/usr/local/lib

上面LD_LIBRARY_PATH是Linux环境变量名,该环境变量主要用于指定查找共享库(动态链接库)时除了默认路径之外的其他路径。(该路径在默认路径之前查找)
移植程序时的经常碰到需要使用一些特定的动态库,而这些编译好的动态库放在我们自己建立的目录里,这时可以将这些目录设置到LD_LIBRARY_PATH中。
然后再次export查看下

[root@mini2440 /]#export
export HOME='/'
export LD_LIBRARY_PATH='/usr/local/lib:'
export LOGNAME='id -un'
export PATH='/sbin:/usr/sbin:/bin:/usr/bin'
export PS1='[\u@\h \W]\$'
export PWD='/'
export SHELL='/bin/sh'
export TERM='vt102'
export USER='id -un'
[root@mini2440 /]#

[root@mini2440 /]#sqlite3
SQLite version 3.7.7.1 2011-06-28 17:39:05
Enter ".help" for instr tions
Enter SQL statements terminated with a ";"
sqlite>

 输入.help可看到其操作命令。


未完,接下篇
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值