libc++ 无法处理 FCGI Streambuf

libc++ can't handle fcgi streambuf

本文关键字:FCGI Streambuf 处理 libc++      更新时间:2023-10-16

我想用fcgi和nginx在C++11中编写一个网站。目前,只有Clang++与libc++相结合才能完全支持C++11。

但是,当我运行fcgi程序时,当有人通过浏览器请求页面时,我会遇到seg错误:libc++似乎不喜欢fcgi使用流的方式。

测试代码:

#include <iostream>
#include <sstream>
#include "fcgio.h"

int main() {
    int count = 0;
    FCGX_Request request;
    FCGX_Init();
    FCGX_InitRequest(&request, 0, 0);
    while(FCGX_Accept_r(&request) == 0) {
        fcgi_streambuf cout_fcgi_streambuf(request.out);
        std::ostream fout(&cout_fcgi_streambuf);
        fout << "Content-type: text/htmlrn" <<
               "rn" <<
               "<title>CGI Hello!</title>" <<
               "<h1>CGI Hello!</h1>" <<
               "Request number" << ++count << "n" << std::endl;
    }
    return 0;
}

上面的代码是用编译的

clang++ -stdlib=libc++ -o index index.cpp -lfcgi++ -lfcgi -std=c++11 -g

gdb输出以下内容:

Program received signal SIGSEGV, Segmentation fault.
0x0000000000402bd9 in sputc (this=0x7fffffffe4d0, __c1=0, __c=10 'n', __c2=4210300) at /usr/include/c++/v1/streambuf:351
351     *__nout_++ = __c;

如果我在没有-stdlib=libc++的情况下编译它,一切都会很好,除了我不能使用一些c++11功能…

有没有一种方法可以在不崩溃的情况下运行我的fcgi应用程序并使用libc++?

我在使用同一组工具时遇到了完全相同的问题。

正如Dietmar Kühl所指出的,libfcgi++不是用libc++编译的,这是我的问题。对他来说是+1000。非常感谢。

作为一个快速的黑客测试,我重新编译了最新的稳定libfcgi,其中包含以下标志:

-stdlib=libc++

通过像往常一样运行./configure,然后编辑fcgi-dev-kit/libfcgi/Makefile:中Makefile中的两行

CXX = clang++
# ....
CXXFLAGS = -g -O2 -std=c++0x -stdlib=libc++

然后在顶层目录中运行CCD_ 3。

例如,与fcgi-dev-kit/libfcgi/.libs/libfcgi++.a中的结果库链接,修复了分段错误。

开发工具包可以在这里找到:http://www.fastcgi.com/drupal/node/5.如果你需要像我一样使用libc++,你需要找到一个长期的解决方案来链接一个经过适当编译的libfcgi++。