最近在学习fcgi,第一步编译fcgi就遇到了一些问题呵呵,下面说说问题原因及解决办法
首先从fastcgi.com下载最新的版本放到本地,然后按照官方手册,下载后需进行两步操作才可以得到库文件
% ./configure
% make
一、首先执行./configure,编译过程中出现如下错误
fcgio.cpp: In destructor ‘virtual fcgi_streambuf::~fcgi_streambuf()’:
fcgio.cpp:50: error: ‘EOF’ was not declared in this scope
fcgio.cpp: In member function ‘virtual int fcgi_streambuf::overflow(int)’:
fcgio.cpp:70: error: ‘EOF’ was not declared in this scope
fcgio.cpp:75: error: ‘EOF’ was not declared in this scope
fcgio.cpp: In member function ‘virtual int fcgi_streambuf::sync()’:
fcgio.cpp:86: error: ‘EOF’ was not declared in this scope
fcgio.cpp:87: error: ‘EOF’ was not declared in this scope
fcgio.cpp: In member function ‘virtual int fcgi_streambuf::underflow()’:
fcgio.cpp:107: error: ‘EOF’ was not declared in this scope
make[2]: *** [fcgio.lo] 错误 1
解决办法
在/include/fcgio.h文件中引入 #include <cstdio> , 估计是fcgi的作者的gcc版本和我机器上面的不一样
二、执行make操作,并且没有生成需要的文件libfcgi.a,出现如下错误
make[2]: Nothing to be done for `all'.
百度了一下,一般的解决办法是make clean->ldconfig->make,但执行后并没有任何改善。
于是查看编译记录,发现其中有如下操作
ar cru .libs/libfcgi.a libfcgi_la-fcgiapp.o libfcgi_la-fcgi_stdio.o libfcgi_la-os_unix.o
ranlib .libs/libfcgi.a
creating libfcgi.la
。。。。
ar cru .libs/libfcgi++.a fcgio.o
ranlib .libs/libfcgi++.a
creating libfcgi++.la
由于在编译过程中libfcgi.la和libfcgi++.la文件已被生成,于是尝试手动生成库文件
cd libfcgi
ar cru libfcgi.a libfcgi_la-fcgiapp.o libfcgi_la-fcgi_stdio.o libfcgi_la-os_unix.o
ranlib libfcgi.a
ar cru libfcgi++.a fcgio.o
ranlib libfcgi++.a
成功,可以正常生成需要的文件libfcgi.a,至于是否可用下面马上测试
编写测试代码tiny-fcgi.c:
#include "fcgi_stdio.h"
#include <stdlib.h> int main(void) { int count = 0; while(FCGI_Accept() >= 0) printf("Content-type: text/html\r\n" "\r\n" "<title>FastCGI Hello!</title>" "<h1>FastCGI Hello!</h1>" "Request number %d running on host <i>%s</i>\n", ++count, getenv("SERVER_NAME"));
return 0;
}
编译:g++ -o tiny-cgi tiny-cgi.o -L../libfcgi/ -lfcgi -I../include/
生成:tiny-cgi
注:
1、ar cru 创建库文件
通常人们使用“ar cru liba.a a.o"这样的命令来创建一个库并把a.o添加进去。"c"关键字告诉ar需要创建一个新库文件,如果没有指定这个标志则ar会创建一个文件,同时会给出 一个提示信息,"u"用来告诉ar如果a.o比库中的同名成员要新,则用新的a.o替换原来的。
2、ranlib更新静态库的符号索引表
静态库文件需要使用“ar”来创建和维护。当给静态库增建一个成员时(加入一个.o文件到静态库中),“ar”可直接 将需要增加的.o文件简单的追加到静态库的末尾。之后当我们使用这个库进行连接生成可执行文件时,链接程序“ld”却提示错误,这可能是:主程序使用了之 前加入到库中的.o文件中定义的一个函数或者全局变量,但连接程序无法找到这个函数或者变量。
这个问题的原因是:之前我们将编译完成的.o文件直接加入到了库的末尾,却并没有更新库的有效符号表。连接程序进行连接时,在静态库的符号索引表中无法定 位刚才加入的.o文件中定义的函数或者变量。这就需要在完成库成员追加以后让加入的所有.o文件中定义的函数(变量)有效,完成这个工作需要使用另外一个 工具“ranlib”来对静态库的符号索引表进行更新。
3、链接库的使用
g++ -o mainlib main.cpp -L. -lmylib同样使用静态库时,gcc会在静态库名前加上前缀lib,然后追加扩展名.a得到的静态库文件名来查找静态库文件.
g++ -o mainsharelib main.cpp -L.-lmysharelib
gcc会在动态库名前加上前缀lib,然后追加扩展名.so得到的动态库文件名来查找动态库文件.
若找到,则载入动态库,否则将提示类似上述错误而终止程序运行。通过修改 LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。
指定 头文件用 -I 目录名。 -I /home/andy/share/mini_player
指定 库文件: -L 后面是具体的目录。-L /home/andy/share/libmad_install