libc ++无法处理fcgi streambuf

时间:2013-09-01 15:03:44

标签: c++ c++11 nginx fastcgi libc++

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

但是当我运行我的fcgi程序时,当有人通过浏览器请求页面时,我遇到了一个seg-fault:似乎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/html\r\n" <<
               "\r\n" <<
               "<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-app而不会崩溃并使用libc ++?

1 个答案:

答案 0 :(得分:2)

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

正如DietmarKühl指出的那样,libfcgi ++没有用libc ++编译,这对我来说是个问题。给他+1000。非常感谢。

作为一个快速的hacky测试,我用标志重新编译了最新的稳定libfcgi:

-stdlib=libc++

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

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

然后在顶级目录中运行make

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

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