【问题标题】:libc++ can't handle fcgi streambuflibc++ 无法处理 fcgi streambuf
【发布时间】:2013-09-04 18:19:26
【问题描述】:

我想使用 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++?

【问题讨论】:

  • 您是否使用选项编译了 fcgi++,尤其是使用相同的标准 C++ 库?
  • fcgi 未编译,仅使用“apt-get install libfcgi-dev”安装。
  • 那么,它是用哪个标准 C++ 库编译的?如果它不是用 libc++ 编译的,它不太可能与 libc++ 一起工作。从它的声音来看,您正在使用与 libstdc++ 和 libc++ 相同版本的 libfcgi++:这是行不通的!标准 C++ 库将不兼容。实际上令人惊讶的是,代码首先链接。尝试使用 libc++ 构建 libfcgi++,看看生成的库是否能解决您的问题。
  • 这可能确实是问题所在:O 感谢您的帮助!当我用libc++成功编译libfcgi时我会回来
  • Everythink 现在完美运行!谢谢!!

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


【解决方案1】:

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

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

作为一个快速的 hacky 测试,我用 flag 重新编译了最新的稳定 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++.a 中的生成库链接,修复了分段错误。

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

【讨论】:

  • 我只用CC="clang" CXX="clang++" CXXFLAGS="-stdlib=libc++" ./configure编译它。所以我不必编辑makefile。通过 make install 我安装了库,所以我可以简单地用 -lfcgi 和 -lfcgi++ 链接它们
猜你喜欢
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
  • 2022-01-21
  • 1970-01-01
  • 2015-10-17
  • 2012-06-11
  • 2013-07-16
相关资源
最近更新 更多