这是我用C语言编写的简单的hello-world FastCGI脚本。

#include "fcgi_stdio.h"
#include <stdlib.h>

void 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"));
}


如果我使用静态链接对其进行编译,则效果很好。

gcc -o "test.fcg" "test.c" /usr/local/lib/libfcgi.a


但是当使用动态链接时...

gcc -o "test.fcg" -lfcgi "test.c"


如果在Apache的error_log中出现以下错误,此操作将失败。

/var/www/fcgi-bin/test.fcg: error while loading shared libraries: libfcgi.so.0: cannot open shared object file: No such file or directory
[Thu Mar 05 14:04:22.707096 2015] [:warn] [pid 6544] FastCGI: (dynamic) server "/var/www/fcgi-bin/test.fcg" (pid 6967) terminated by calling exit with status '127'
[Thu Mar 05 14:04:22.707527 2015] [:warn] [pid 6544] FastCGI: (dynamic) server "/var/www/fcgi-bin/test.fcg" has failed to remain running for 30 seconds given 3 attempts, its restart interval has been backed off to 600 seconds


所以我告诉Apache和mod_fastcgi在LD_LIBRARY_PATH中设置httpd.conf变量来查找该文件所在的位置...

SetEnv LD_LIBRARY_PATH /usr/local/lib


...和fastcgi.conf

FastCgiConfig -initial-env LD_LIBRARY_PATH=/usr/local/lib -idle-timeout 20 -maxClassProcesses 1


使用静态链接的脚本,getenv("LD_LIBRARY_PATH")返回/usr/local/lib,但是动态链接的脚本仍会为libfcgi.so.0抛出未找到的错误。

有什么想法可以使这项工作吗?

提前致谢。

最佳答案

我在nginx上遇到了类似的问题,我通过使用rpath选项修复了它。

不确定是否对Apache有帮助。尝试像这样构建二进制文件:

gcc test.c -Wl,-rpath /usr/local/lib -lfcgi -o test.fcg


确保库文件libfcgi.so.0位于/usr/local/lib中。

如果您无权访问/usr/local/lib,则在lib中创建$HOME文件夹,然后在其中复制库文件。并更新rpath指向那里。例如,如果您的$HOME/home/xyz,那么您将构建如下:

gcc test.c -Wl,-rpath /home/xyz/lib -lfcgi -o test.fcg


有时,我使用此技巧来加载比系统上已安装的库新的库。

关于c - FastCGI脚本在Apache 2.4.6和mod_fastcgi中找不到libfcgi.so.0,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28883708/

10-11 22:58
查看更多