gcc 编译fcgi中出现的一些问题及解决方法

最近在学习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文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。
Ps:当静态库和动态库同名时, gcc命令将优先使用动态库。
    g++ -o mylib main.cpp  ./libname.a(libname.so)也可以
 4、头文件路径指定

指定 头文件用 -I 目录名。          -I /home/andy/share/mini_player
指定 库文件: -L 后面是具体的目录。-L /home/andy/share/libmad_install



 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值