使用 boost 和 C++11 构建过程崩溃
Build process crashes with boost and C++11
我有:
- 我正在为 Linux 编写 Qt 应用程序(我在 Linx Mint 17.3 64 位中工作)
- 我在我的 Qt 项目(Qt 版本 5.5)中使用 C++11 功能
- 我想将 libslave 添加到我的 Qt 项目中。
- libslave 使用已弃用的(对于 C++11)
boost::function
、boost::shared_ptr
、boost::bind
和 boost::any
.
我的烦恼:
当我用 gcc 编译时(v 整个项目或只有带 -std=c++11
标志的库 boost 崩溃并出现许多错误。Qt Creator 显示大约 4000 个错误,但它们非常相似,看起来像:
typedef boost::function< void( RecordSet& )> callback;
is not complete type
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 薄荷:17.3 罗莎
更新:
例子:
您可以通过 this link.
下载我尝试编译的代码
说明:
- 下载 tarball
- 摘录
- 转到文件夹并键入 make(一切正常)
打开 MakeFile 并将 CXX 变量替换为
CXX = g++ -std=c++11
再试一次,会报错
P.S。
要编译库,您需要 libmysqld-dev
、libboost-all-dev
、libmysqlclient-dev
。
可能您还需要其他东西,但我不记得了。对不起。
我找到了 hack,它对我有用。
我用这样的字符串将文件 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_ptr
、boost::function
替换为std::shared_ptr
和std::function
。
在此之后,一切都可以编译并使用 -std=c++11
标志正常工作。
nanomysql.h的完整代码你可以在这里看到:
使用 libslave 的实际分支 - https://github.com/vozbu/libslave 支持 c++11。即将支持 mysql 5.6 和 5.7
我有:
- 我正在为 Linux 编写 Qt 应用程序(我在 Linx Mint 17.3 64 位中工作)
- 我在我的 Qt 项目(Qt 版本 5.5)中使用 C++11 功能
- 我想将 libslave 添加到我的 Qt 项目中。
- libslave 使用已弃用的(对于 C++11)
boost::function
、boost::shared_ptr
、boost::bind
和boost::any
.
我的烦恼:
当我用 gcc 编译时(v 整个项目或只有带 -std=c++11
标志的库 boost 崩溃并出现许多错误。Qt Creator 显示大约 4000 个错误,但它们非常相似,看起来像:
typedef boost::function< void( RecordSet& )> callback; is not complete type
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 薄荷:17.3 罗莎
更新:
例子: 您可以通过 this link.
下载我尝试编译的代码说明:
- 下载 tarball
- 摘录
- 转到文件夹并键入 make(一切正常)
打开 MakeFile 并将 CXX 变量替换为
CXX = g++ -std=c++11
再试一次,会报错
P.S。
要编译库,您需要 libmysqld-dev
、libboost-all-dev
、libmysqlclient-dev
。
可能您还需要其他东西,但我不记得了。对不起。
我找到了 hack,它对我有用。
我用这样的字符串将文件 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_ptr
、boost::function
替换为std::shared_ptr
和std::function
。
在此之后,一切都可以编译并使用 -std=c++11
标志正常工作。
nanomysql.h的完整代码你可以在这里看到:
使用 libslave 的实际分支 - https://github.com/vozbu/libslave 支持 c++11。即将支持 mysql 5.6 和 5.7