linux - 使用 boost 和 C++11 构建进程崩溃

标签 linux qt c++11 boost crash

我有:

  • 我正在为 Linux 编写 Qt 应用程序(我使用 Linx Mint 17.3 64 位)
  • 我在 Qt 项目(Qt 版本 5.5)中使用 C++11 功能
  • 我想添加libslave到我的 Qt 项目。
  • libslave 使用已弃用的(对于 C++11)boost::function , boost::shared_ptr , boost::bindboost::any .
<小时/>

我的烦恼:

当我使用 gcc 进行编译时(v 整个项目或仅带有 -std=c++11 标志的库,Boost 崩溃并出现许多错误。Qt Creator 显示大约 4000 个错误,但它们非常相似,看起来像:

  1. typedef boost::function< void( RecordSet& )> callback; is not complete type

  2. BOOST_NOEXCEPT'does not name a type ~any() BOOST_NOEXCEPT

等等...

我尝试用 C++11 重写库 std图书馆,但是 std不包含boost::any模拟,所以这是个坏主意。

<小时/>

问题:

如何使用 c++11 编译 boost(或至少 libslave)?

<小时/>

Boost 版本:1.54(来自存储库)

g++ 版本:4.8.4(来自存储库)

Qt版本:5.5(从官方网站下载)

Linux Mint:17.3 Rosa

<小时/>

更新:

示例: 您可以通过 this link 下载我尝试编译的代码.

说明:

  1. 下载压缩包
  2. 摘录
  3. 转到文件夹并只需输入 make (一切正常)
  4. 打开MakeFile并将CXX变量替换为

    CXX = g++ -std=c++11

  5. 再次尝试 make 将会出现错误。

附注 要编译库,您需要 libmysqld-dev , libboost-all-dev , libmysqlclient-dev

也许你还需要别的东西,但我不记得了。抱歉。

最佳答案

我找到了这个技巧,它对我有用。

我用这样的字符串将文件 nanomysql.h 中的 boost::bind 用法替换为 std::bind:

...
typedef std::map<std::string, field> value_t;
typedef std::vector< value_t > result_t;

void store(result_t& out)
{
    //You need specify template because of push_back has overloads
    auto hack = std::bind<void(result_t::*)(const value_t&)>(&result_t::push_back, &out, _1);
    use(hack);
}
...

并将库中所有文件中的所有 boost::shared_ptrboost::function 替换为 std::shared_ptrstd::function

此后,一切都会编译并使用 -std=c++11 标志正常工作。

nanomysql.h 的完整代码你可以在这里看到:

Link to code

关于linux - 使用 boost 和 C++11 构建进程崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35309793/

相关文章:

c++ - 如果可能,尝试对字符串进行静态断言,或者在不可能时回退到运行时检查

c++ - 使用初始化列表构造时如何避免创建(和删除)临时对象?

C++11:有没有办法强制类只能用作右值?

linux - Yocto 项目中是否有任何 'Project File' 或 'Workspace file' 或 'Solution file' 等价物?

C套接字编程错误

python - 用pyqtgraph添加新数据条最快的方法

c++ - 什么是常量无效?

linux - 如何在 Linux 上获取虚拟桌面名称/编号?

Linux根据usb口执行脚本

android - Qt 安卓/iOS : How to control device volume in qml