LV11-02-CGIC库-01-移植过程

本文主要是CGIC库移植的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。

点击查看使用工具及版本
Windows windows11
Ubuntu Ubuntu16.04的64位版本
VMware® Workstation 16 Pro 16.2.3 build-19376536
SecureCRT Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日
Linux开发板 华清远见 底板: FS4412_DEV_V5 核心板: FS4412 V2
u-boot 2013.01
linux内核 linuz-3.14
点击查看本文参考资料
参考方向参考原文
华清远见课程华清远见课程
驱动开发指南i.MX6ULL Linux阿尔法开发板资料
BOA官网Boa Webserver
CGIC仓库boutell/cgic
点击查看相关文件下载
文件下载链接
------

一、CGI和 CGIC

1. CGI

CGI(Common Gateway Interface) 是WWW技术中最重要的技术之一,有着不可替代的重要地位。CGI是外部应用程序(CGI程序)与Web服务器之间的接口标准,是在CGI程序和Web服务器之间传递信息的过程。CGI规范允许Web服务器执行外部程序,并将它们的输出发送给Web浏览器,CGI将Web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。在物理上是一段程序,运行在服务器上,提供同客户端HTML页面的接口。浏览器把这些信息传送到服务器的CGI目录下特定的CGI程序中,于是CGI程序在服务器上按照预定的方法进行处理。

image-20220921102644761

CGI程序可以运行在 BOA 服务器中,我们通过 CGI 接口可以实现 C 语言与 HTML语言数据的交互,意思就是我们可以通过CGI,将C语言程序中的数据写入到网页中,也可以通过CGI,让C语言程序接收网页端的数据,这样就打通了C语言与HTML之间沟通的桥梁。

2. CGIC

CGIC 是一个支持 CGI 开发的开放源码的标准 C 库,可以免费使用,只需要在开发的站点和程序文档中有个公开声明即可,表明程序使用了 CGIC 库,用户也可以购买商业授权而无需公开声明。

CGIC 能够提供以下功能:

  • 分析数据,并自动校正一些有缺陷的浏览器发来的数据;
  • 透明接收用 GET 或 POST 方法发来的 Form 数据;
  • 能接受上传文件;
  • 能够设置和接收 cookies ;
  • 用一致的方式处理 From 元素里的回车;
  • 提供字符串,整数,浮点数,单选或多选功能来接收数据;
  • 提供数字字段的边界检查;
  • 能够将 CGI 环境变量转化成 C 中的非空字符串;
  • 提供 CGI 程序的调试手段,能够回放 CGI 程序执行时的 CGI 状态;

总之, CGIC 是一个功能比较强大的支持 CGI 开发的标准 C 库,并支持 Linux , Unix 和 Windows 等多操作系统。

二、文件准备

1. CGIC 源码

1.1 源码获取途径

比较尴尬,网上很多教程都写了 CGIC 的官网地址,但是吧,不清楚为啥,点进去找不到源码,似乎网站都不对,就去 github 试了试,发现官方仓库在这里:boutell/cgic: cgic: an ANSI C library for CGI Programming (github.com)

所以就从 github 下载源码喽,我写这篇笔记的时候最新的已经是 2.08 版本,目前还未找到老版本在哪下载,就先用这老师给的 cgic205.tar.gz 这个压缩包的文件啦。可以在这里下载:

cgic205.tar.gzCGIC库(密码:2gh6)

1.2 获取源码文件

下载 cgic205.tar.gz 这个压缩包并将其存放于 ubuntu 下的共享文件夹下,路径为:

1
/mnt/hgfs/Sharedfiles/

1.3 拷贝解压

然后我们可以将这个源码文件拷贝解压到 ubuntu 中,方便后边编译,我们可以在终端执行以下命令:

1
2
3
cp /mnt/hgfs/Sharedfiles/cgic205.tar.gz ~/6temp/      # 拷贝压缩包
cd ~/6temp/
tar -xvf cgic205.tar.gz # 解压

然后我们可以得到下边这些文件(通过 tree 命令查看):

1
2
3
4
5
6
7
8
9
10
11
12
13
hk@vm:~/6temp/cgic205$ tree
.
├── capture.c
├── cgic.c
├── cgic.h
├── cgic.html
├── cgictest.c
├── license.txt
├── Makefile
├── readme.txt
└── support.txt

0 directories, 9 files

2. 文件分析

上边我们已经看了下 CGIC 解压后的文件,文件不多,各个文件作用如下:

文件名 说明
cgic.h 头文件
cgic.c CGIC的源代码文件
cgictest.c CGIC库的作者提供的一个CGI程序例子
capture.c 用于调试CGI程序的工具
Makefile 安装CGIC的脚本文件

可以看到,整个库实际上就是 cgic.c 一个文件,可以说是非常的精炼。可以把 CGIC 安装为操作系统的一个动态链接库,这样我们每次编译的时候,就不需要有 cgic.c 这个源文件了。但是由于需要,我们在后续使用过程中可能会修改 cgic.c 代码,所以我们不把它安装进系统。每次编译的时候,只要把 cgic.c 和 cgic.h 放到当前文件夹就好了。

二、 CGIC 移植

1. Makefile 修改

其实这个库我们并不需要怎么移植,只需要更换一下 Makefile 中的编译工具就可以了,便于我们使用即可,修改过的 Makefile 如下:

点击查看详情
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
##============================================================================#
# Copyright © hk. 2022-2025. All rights reserved.
# File name : Makefile
# Author : qidaink
# Date : 2022-09-05
# Version :
# Description: CGIC Makefile(修改后便于自己使用)
# Others : mingw32 and cygwin users: replace .cgi with .exe
# Log :
##============================================================================#
##
#=============================================================================#
# 编译工具
ifeq ($(ARCH), arm)
CROSS_COMPILE := arm-none-linux-gnueabi-
else
CROSS_COMPILE :=
endif

CFLAGS := -g -Wall
CC := $(CROSS_COMPILE)gcc
AR := $(CROSS_COMPILE)ar
#=============================================================================#
ROOTFS := /home/hk/4nfs/rootfs
NFSBOA_CGIBIN := $(ROOTFS)/boa/cgi-bin
NFSBOA_WWWDIR := $(ROOTFS)/boa/www

RANLIB := ranlib
LIBS := -L./ -lcgic
#=============================================================================#
# 要生成的所有目标
all: libcgic.a cgictest.cgi capture
#=============================================================================#
install: libcgic.a
cp libcgic.a /usr/local/lib
cp cgic.h /usr/local/include
@echo libcgic.a is in /usr/local/lib. cgic.h is in /usr/local/include.

#=============================================================================#
# libcgic.a目标编译生成
libcgic.a: cgic.o cgic.h
rm -f libcgic.a
$(AR) rc libcgic.a cgic.o
$(RANLIB) libcgic.a

#=============================================================================#
# cgictest.cgi 目标编译生成
cgictest.cgi: cgictest.o libcgic.a
$(CC) $(CFLAGS) cgictest.o -o cgictest.cgi ${LIBS}

#=============================================================================#
# capture 目标编译生成
capture: capture.o libcgic.a
$(CC) $(CFLAGS) capture.o -o capture ${LIBS}

#=============================================================================#
# 我们自定义目标编译生成


#=============================================================================#
# 拷贝到我们的开发板
nfscpy:
mv *.o ./obj/
mv *.a *.cgi capture ./cgi-bin/
sudo cp ./cgi-bin/* $(NFSBOA_CGIBIN)

# 清除编译生成的文件
.PHONY: clean
clean:
rm -f *.o *.a obj/*.o cgi-bin/* cgictest.cgi capture
#=============================================================================#
# 打印信息
print:
@echo "CC = $(CC)"
@echo "AR = $(AR)"
@echo "ROOTFS = $(ROOTFS)"
@echo "NFSBOA_CGIBIN = $(NFSBOA_CGIBIN)"
@echo "NFSBOA_WWWDIR = $(NFSBOA_WWWDIR)"

2. 编译源码

接下来就是用我们修改后的 makefile 来编译源码,我们执行:

1
make ARCH=arm # ARM 平台

然后在目录下就会生成三个目标文件。

3. 效果测试

  • 文件拷贝

我们上边已经编写了拷贝命令,来自动完成 .a 文件和 .cgi 文件以及 capture 文件的拷贝这些文件都需要拷贝到 boa 服务器的 cgi-bin 目录下:

1
make nfscpy
  • 效果测试

我们在开发板中运行 boa 服务器,然后在 ubuntu 主机浏览器输入:

1
http://192.168.10.102/cgi-bin/cgictest.cgi

若是打开以下页面,则说明 CGI 可以正常使用:

image-20220905145742103