2013-09-01 49 views
1

我想使用fcgi和nginx在C++ 11中编写一个网站。目前只有Clang ++与libC++结合完全支持C++ 11。libC++无法处理fcgi streambuf

但是当我运行我的FCGI程序,我得到一个赛格故障,当有人请求该页面在浏览器:它似乎的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++?

+0

您是否用选项编译fcgi ++,特别是使用相同的标准C++库? –

+0

fcgi未编译,只安装“apt-get install libfcgi-dev”。 – al3xst

+2

那么,它编译了哪个标准C++库?如果它没有用libC++编译,那么它不太可能用于libC++。从它的声音中,您正在使用与libstdC++和libC++相同版本的libfcgi ++:这不会起作用!标准C++库不兼容。实际上令人惊讶的是,代码链接在第一位。尝试使用libC++构建libfcgi ++,并查看产生的库是否解决了您的问题。 –

回答

2

我有完全相同的问题,使用同一套工具。

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

作为一个快速哈克测试,我重新编译了标志的最新稳定libfcgi:在fcgi-dev-kit/libfcgi/Makefile

-stdlib=libc++ 

运行./configure像往常一样,然后修改Makefile中的两行发现:

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

,然后在顶层目录中运行make

在FCGI-DEV-试剂盒/ libfcgi /的.libs/libfcgi ++所得库链接。一个例如固定的段故障。

开发套件可以在这里找到:http://www.fastcgi.com/drupal/node/5。如果您需要使用libC++,您需要找出一个长期解决方案,以便与适当编译的libfcgi ++进行链接,就像我一样。

+1

我用'CC =“clang”CXX =“clang ++”CXXFLAGS =“ - stdlib = libC++”。/ configure'编译它。所以我不必编辑makefile。而使用make install我安装了libs,所以我可以简单地使用-lfcgi和-lfcgi ++来链接它们 – al3xst