Linux环境下如何将C编写的程序编译为*.cgi

时间:2022-12-12 07:25:47
我现在在做一个嵌入式WEB服务器。是基于ARM7的BOA服务器。程序都已经编写好了。原来打算是在VC下编译,然后再COPY到LINUX环境下编译生成能下在到ARM板上的镜像文件。后来发现VC编译出来的代码太大了。而我的箱子最多允许烧800K。所以只好回到LINUX下。
 
    问题是,我不知道如何编译成CGI的形式。我研究它的Makefile也研究不出来如何编译。
文件目录如下:
   |
   |---cgihtml.a
   |---cgi-lib.c
   |---cgi-lib.h
   |---cgi-llist.c
   |---cgi-llist.h
   |---html-lib.c
   |---html-lib.h
   |---string-lib.c
   |---string-lib.h
   |---Makefile
   |---examples
   |       |
          |---cgi-lib.h
          |---cgi-llist.h
          |---html-lib.h
          |---ignore.cgi.c
          |---index-sample.cgi.c
          |---mail.cgi.c
          |---query-results.c
          |---string-lib.h
          |---test.cgi.c
          |---Makefile
最上面的一个Makefile的内容如下:
# Makefile for cgihtml.a
# Based on original Makefile of Eugene Eric Kim <eekim@eekim.com>

# Adapted to the uClinux dist by
# Heiko Degenhardt <linux@sentec-elektronik.de>
# Version:      01.00
# Date:         20030325

# ATTENTION!
# There are security bugs in that version of cgihtml!
# Don't use this version on a remote accessible server!
# Search for "cgihtml" at http://www.securityfocus.com/search!

# CHANGES
#
# 20030325 - adapted to the uClinux-dist
#    (hede)


# macros and variables
RANLIB = $(CROSS)ranlib

# Set UPLOADDIR to your (witeable) directory for uploads:
CFLAGS += -DUNIX -DUPLOADDIR='"/usr/tmp"'

OBJS = string-lib.o cgi-llist.o cgi-lib.o html-lib.o
LIB = cgihtml.a

# targets
$(LIB): $(OBJS)
$(CROSS)ar cr $@ $(OBJS)
$(RANLIB) $@

examples: $(LIB)
cd examples; make all

all: examples

install: all
cp -f *.h $(LIB) $(INSTALLDIR)
cd examples; make install

clean:
-rm -f *.o $(LIB)

clobber:
-rm -f *.o $(LIB)
cd examples; make clean
最下面的一个Makefile的内容如下:
# Makefile for cgihtml examples
# Based on original Makefile of Eugene Eric Kim <eekim@eekim.com>
#
# Adapted to the uClinux dist by
# Heiko Degenhardt <linux@sentec-elektronik.de>
# Version:  01.00
# Date: 20030325
#
# ATTENTION!
# There are security bugs in that version of cgihtml!
# Don't use this version on a remote accessible server!
# Search for "cgihtml" at http://www.securityfocus.com/search!

# CHANGES
#
# 20030325  - adapted to the uClinux-dist
#             (hede)


# macros and variables
LIB = ../cgihtml.a

EXEC = query-results mail.cgi index-sample.cgi ignore.cgi test.cgi


# targets
all: $(LIB) $(EXEC) 

query-results: query-results.o
$(CC) $(LDFLAGS) -o $@ $^ $(LIB) $(LDLIBS$(LDLIBS_$@))

mail.cgi: mail.cgi.o
$(CC) $(LDFLAGS) -o $@ $^ $(LIB) $(LDLIBS$(LDLIBS_$@))

index-sample.cgi: index-sample.cgi.o
$(CC) $(LDFLAGS) -o $@ $^ $(LIB) $(LDLIBS$(LDLIBS_$@))

ignore.cgi: ignore.cgi.o
$(CC) $(LDFLAGS) -o $@ $^ $(LIB) $(LDLIBS$(LDLIBS_$@))

test.cgi: test.cgi.o
$(CC) $(LDFLAGS) -o $@ $^ $(LIB) $(LDLIBS$(LDLIBS_$@))



$(LIB):
cd ..; make cgihtml.a


romfs:
$(ROMFSINST) query-results /home/httpd/cgi-bin/query-results
$(ROMFSINST) mail.cgi /home/httpd/cgi-bin/mail.cgi
$(ROMFSINST) index-sample.cgi /home/httpd/cgi-bin/index-sample.cgi
$(ROMFSINST) ignore.cgi /home/httpd/cgi-bin/ignore.cgi
$(ROMFSINST) test.cgi /home/httpd/cgi-bin/test.cgi

clean:
-rm -f $(EXEC) $(OBJ) *.elf *.gdb *.o

以下是它如何编译的资料:
1.1. Requirements
cgihtml was written for Unix machines in C, although it has been successfully ported to Windows 95 and NT, VMS, OS-9, and other operating systems. All you need is a C compiler, and you should be set.

By default, cgihtml assumes that the CGI source code goes in the cgi-src directory and the binaries in the cgi-bin directory.


--------------------------------------------------------------------------------

1.2. Obtaining and unpacking the distribution
You may find cgihtml.tar.gz at ftp://ftp.eekim.com/users/eekim/cgihtml/.

To unpack the distribution, you must first gunzip it (using the GNU gzip utility) and then untar it. Copy the distribution into your CGI source directory, and try the following command:

     % gzip -dc cgihtml.tar.gz | tar xvf -

cgihtml is also available in UNIX compressed (.Z) and PKZipped (.zip) format.


--------------------------------------------------------------------------------

1.3. Compiling the library
To compile the library, examine the Makefiles in the cgihtml and examples directories, and make sure you are satisfied with the variables.

Makefile variables
INSTALLDIR in cgihtml's Makefile should point to your CGI source directory, while INSTALLDIR in your examples directory should point to your server's CGI binary directory.

Compiling for Win32
If you're compiling for Win32 (ie. Windows 95/NT), make sure to uncomment the line with -DWINDOWS.

Configuring File Upload
By default, the file upload directory is set to /tmp. To change this value, uncomment #-DUPLOADDIR='"/tmp"' in the Makefile and replace /tmp with the directory of your choice. Make sure that whichever directory you choose is surrounded by both the single and double quotes, ie: '"/foo/bar"'

Compiling and Installing
When you are satisfied with the Makefiles, type:

     % make cgihtml.a

This will produce the file cgihtml.a. To compile the library as well as all of the example programs, type:

     % make all

To install the library and examples, type:

     % make install

If you want to compile and/or install the example programs separately, change to the examples subdirectory and use make there.


--------------------------------------------------------------------------------

1.4. Porting
While compiling the libraries on various Unix machines, you may have trouble with the "ranlib" command. If you system doesn't seem to have this command, you most likely don't need. Set the RANLIB variable in the Makefile to "true".

If you're compiling for Win32, make sure you use the -DWINDOWS directive when compiling.

If you are compiling for DOS/16-bit Windows, VMS, or OS-9, you will need to change the filenames to support your OS.



2.2. Compiling your program
To compile your program with the library, include the file cgihtml.a when linking your object files. For example, if your main object file is program.cgi.o, the following should work successfully:

cc -o program.cgi program.cgi.o cgihtml.a

*********************
**cc -o program.cgi program.cgi.o cgihtml.a这个命令我编译不通过。
按照它的资料,我只能把第一个编译通过。
剩下的我根本就通不过了。


请问如何解决这个问题。
恳请帮忙啊。

18 个解决方案

#1


#Makefile
# created by limlzm, 2004/07/28
ROOT = /

CC = gcc
LDD = gcc

CFLAGS = -g 
CFLAGS += -I../../include
CFLAGS += -I../../libs/lib

LDFLAGS = -L. -L/lib -lssl -L
OBJS = lib_cgi.o 

#---------------------------------system
OBJS_LOGIN = login.o
OBJS_LOGOUT = logout.o
#---------------------------------------
all : login logout

login : $(OBJS_LOGIN) $(LIB) $(OBJS)
$(LDD) $(LDFLAGS) -o login.cgi $(OBJS_LOGIN) $(OBJS)

logout : $(OBJS_LOGOUT) $(LIB) $(OBJS)
$(LDD) $(LDFLAGS) -o logout.cgi $(OBJS_LOGOUT) $(OBJS)

install :login logout
cp *.cgi /usr/local/apache/cgi-bin/ -f
clean :
rm -rf *.o *.cgi

应该看得懂吧?大概模式是这样。

#2


CFLAGS += -DUNIX -DUPLOADDIR='"/usr/tmp"' 这个语句是啥意思,以及CFLAGS代表的是??
$(CC) $(LDFLAGS) -o $@ $^ $(LIB) $(LDLIBS$(LDLIBS_$@)) 这个语句是啥意思,这个语句用最原始的代码表示是啥??
 
请问上面的一个是不是编译一个源代码阿。

另外,我马上要走了,干12:00的火车,明年会来我一定给分的。

这里把我给难住了,能否说明一下上面说用到的文件,是不是就一个*.c,然后就一个Makefile阿。

恳请帮助。不胜感谢!!!

#3


CFLAGS只不过自己定义的一个变量,$(LDFLAGS)就引用这个变量里的内容,还有其他符号代表一些简化步骤,详细代表什么就要看makefile文档了,网上这些资料还是很多的,可以搜搜。

#4


CFLAG就是gcc的编译参数
-DUNIX -DUPLOADDIR='"/usr/tmp"'
在C里面就是
#define UNIX
#define UPLOADDIR    "/usr/tmp"

#5


请问:
ROOT = /         

CFLAGS = -g 
CFLAGS += -I../../include
CFLAGS += -I../../libs/lib

LDFLAGS = -L. -L/lib -lssl -L

请问这上面的是干啥用的阿??
请教??

#6


ROOT = / 暂时没用到,不用理,只不过当申请一个变量char *ROOT = "/";而已;
CFLAGS = -g 
CFLAGS += -I../../include
CFLAGS += -I../../libs/lib
可以理解为定义变量char *CFLAGS = "-g -I../../inlcude -I../../libs/lib";
-g参数是为了可以调试,后面是包含自定义的头文件和库
LDFLAGS = -L. -L/lib -lssl -L
用来连接库文件的。

#7


CFLAGS += -I../../include中的../../include应该是返回到上级的再上级目录中的include文件中吗?
LDFLAGS = -L. -L/lib -lssl -L
用来连接库文件的。这个能不能说详细一些啊??

如果我把所有的头文件的函数等其他的东西全编写在一个文件中,我想问这种编译方式行不行

第一步:gcc -c test.cgi.c
第二步:gcc -o test.cgi test.cgi.o

#8


在线等???

#9


第一个问题,是包含你当前makefile位置所在的上上级目录,第二个问题具体你需要连接什么库,完全可以去搜,没必要说得那么清楚。第三个问题,你完全可以上机练习一下呀,你都把所有东西写在一个文件中了,这样的方式可以,还可以把这两步合成一步写:gcc -o test.cgi test.c    
另:test.cgi.c是啥东西?是test.c吧。
强烈建议上网找资料解决问题

#10


我知道
这个test.cgi.c是我用的开发板上它附带的源文件是这样的了。
强烈建议上网找资料解决问题,我认为非常对。
而我的最特殊的地方是我编写的代码不是运行在PC上的,而是运行在嵌入式开发板上的一个BOA服务器山的。
刚才我一直在上机试验,他出示missing operator 在二十二行即$(LDD) $(LDFLAGS) -o login.cgi $(OBJS_LOGIN) $(OBJ)

另外gcc -o test.cgi test.c这样的话好像头文件中的函数他提示没有连接上。

按照这个方式做
第一步:gcc -c test.cgi.c
第二步:gcc -o test.cgi test.cgi.o
头文件中的函数他提示没有连接上
有时生成了.cgi,但下载到开发板上确不能运行



#11


在线等!!

#12


是missing seperator.stop

#13


那就加-L 或者-l吧,那要看你所用到的函数需要什么库了

#14


第一步:gcc -c test.cgi.c
第二步:gcc -o test.cgi test.cgi.o
在那里加??


如果用上面的二个命令的话。

另外我想问一个问题,我去年有一次不知道如何弄得,用它自带的Makefile我生成了*.cgi,下载到开发板上也能运行。但是我编写一个非常简单的东西。就显示几个字的代码。然后编译成*.cgi,就是用
第一步:gcc -c test.cgi.c
第二步:gcc -o test.cgi test.cgi.o
结果也成功编译出*.cgi了,但是一下载到开发板上就是不行。我很郁闷。不知道为何。请指示!!

在线等!!!!

#15


就是在LINUX环境下,他的图标显示都是不一样的。

#16


在-o 前加,例如,gcc -L. -lm -o test.cgi test.cgi.c
可man一下gcc,那里有详尽的解释,我没试过你所说的开发板下开发,不能提供意见。

#17


谢谢。
我想如果
按照
gcc -L. -lm -o test.cgi test.cgi.c
生成的二进制文件应该是行得通的是吧。基于PC机的操作系统。

我想是可以的吧。

为何网上嵌入式的这方面的资料这样少啊。

郁闷ing。

#18


昨晚我又重新试了一下。
    发现按照
第一步:gcc -c test.cgi.c
第二步:gcc -o test.cgi test.cgi.o
编译出来的程序在开发板上不能正常运行。而在PC上可以运行。

困 困

#1


#Makefile
# created by limlzm, 2004/07/28
ROOT = /

CC = gcc
LDD = gcc

CFLAGS = -g 
CFLAGS += -I../../include
CFLAGS += -I../../libs/lib

LDFLAGS = -L. -L/lib -lssl -L
OBJS = lib_cgi.o 

#---------------------------------system
OBJS_LOGIN = login.o
OBJS_LOGOUT = logout.o
#---------------------------------------
all : login logout

login : $(OBJS_LOGIN) $(LIB) $(OBJS)
$(LDD) $(LDFLAGS) -o login.cgi $(OBJS_LOGIN) $(OBJS)

logout : $(OBJS_LOGOUT) $(LIB) $(OBJS)
$(LDD) $(LDFLAGS) -o logout.cgi $(OBJS_LOGOUT) $(OBJS)

install :login logout
cp *.cgi /usr/local/apache/cgi-bin/ -f
clean :
rm -rf *.o *.cgi

应该看得懂吧?大概模式是这样。

#2


CFLAGS += -DUNIX -DUPLOADDIR='"/usr/tmp"' 这个语句是啥意思,以及CFLAGS代表的是??
$(CC) $(LDFLAGS) -o $@ $^ $(LIB) $(LDLIBS$(LDLIBS_$@)) 这个语句是啥意思,这个语句用最原始的代码表示是啥??
 
请问上面的一个是不是编译一个源代码阿。

另外,我马上要走了,干12:00的火车,明年会来我一定给分的。

这里把我给难住了,能否说明一下上面说用到的文件,是不是就一个*.c,然后就一个Makefile阿。

恳请帮助。不胜感谢!!!

#3


CFLAGS只不过自己定义的一个变量,$(LDFLAGS)就引用这个变量里的内容,还有其他符号代表一些简化步骤,详细代表什么就要看makefile文档了,网上这些资料还是很多的,可以搜搜。

#4


CFLAG就是gcc的编译参数
-DUNIX -DUPLOADDIR='"/usr/tmp"'
在C里面就是
#define UNIX
#define UPLOADDIR    "/usr/tmp"

#5


请问:
ROOT = /         

CFLAGS = -g 
CFLAGS += -I../../include
CFLAGS += -I../../libs/lib

LDFLAGS = -L. -L/lib -lssl -L

请问这上面的是干啥用的阿??
请教??

#6


ROOT = / 暂时没用到,不用理,只不过当申请一个变量char *ROOT = "/";而已;
CFLAGS = -g 
CFLAGS += -I../../include
CFLAGS += -I../../libs/lib
可以理解为定义变量char *CFLAGS = "-g -I../../inlcude -I../../libs/lib";
-g参数是为了可以调试,后面是包含自定义的头文件和库
LDFLAGS = -L. -L/lib -lssl -L
用来连接库文件的。

#7


CFLAGS += -I../../include中的../../include应该是返回到上级的再上级目录中的include文件中吗?
LDFLAGS = -L. -L/lib -lssl -L
用来连接库文件的。这个能不能说详细一些啊??

如果我把所有的头文件的函数等其他的东西全编写在一个文件中,我想问这种编译方式行不行

第一步:gcc -c test.cgi.c
第二步:gcc -o test.cgi test.cgi.o

#8


在线等???

#9


第一个问题,是包含你当前makefile位置所在的上上级目录,第二个问题具体你需要连接什么库,完全可以去搜,没必要说得那么清楚。第三个问题,你完全可以上机练习一下呀,你都把所有东西写在一个文件中了,这样的方式可以,还可以把这两步合成一步写:gcc -o test.cgi test.c    
另:test.cgi.c是啥东西?是test.c吧。
强烈建议上网找资料解决问题

#10


我知道
这个test.cgi.c是我用的开发板上它附带的源文件是这样的了。
强烈建议上网找资料解决问题,我认为非常对。
而我的最特殊的地方是我编写的代码不是运行在PC上的,而是运行在嵌入式开发板上的一个BOA服务器山的。
刚才我一直在上机试验,他出示missing operator 在二十二行即$(LDD) $(LDFLAGS) -o login.cgi $(OBJS_LOGIN) $(OBJ)

另外gcc -o test.cgi test.c这样的话好像头文件中的函数他提示没有连接上。

按照这个方式做
第一步:gcc -c test.cgi.c
第二步:gcc -o test.cgi test.cgi.o
头文件中的函数他提示没有连接上
有时生成了.cgi,但下载到开发板上确不能运行



#11


在线等!!

#12


是missing seperator.stop

#13


那就加-L 或者-l吧,那要看你所用到的函数需要什么库了

#14


第一步:gcc -c test.cgi.c
第二步:gcc -o test.cgi test.cgi.o
在那里加??


如果用上面的二个命令的话。

另外我想问一个问题,我去年有一次不知道如何弄得,用它自带的Makefile我生成了*.cgi,下载到开发板上也能运行。但是我编写一个非常简单的东西。就显示几个字的代码。然后编译成*.cgi,就是用
第一步:gcc -c test.cgi.c
第二步:gcc -o test.cgi test.cgi.o
结果也成功编译出*.cgi了,但是一下载到开发板上就是不行。我很郁闷。不知道为何。请指示!!

在线等!!!!

#15


就是在LINUX环境下,他的图标显示都是不一样的。

#16


在-o 前加,例如,gcc -L. -lm -o test.cgi test.cgi.c
可man一下gcc,那里有详尽的解释,我没试过你所说的开发板下开发,不能提供意见。

#17


谢谢。
我想如果
按照
gcc -L. -lm -o test.cgi test.cgi.c
生成的二进制文件应该是行得通的是吧。基于PC机的操作系统。

我想是可以的吧。

为何网上嵌入式的这方面的资料这样少啊。

郁闷ing。

#18


昨晚我又重新试了一下。
    发现按照
第一步:gcc -c test.cgi.c
第二步:gcc -o test.cgi test.cgi.o
编译出来的程序在开发板上不能正常运行。而在PC上可以运行。

困 困