我有:
- 我正在为 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 Mint:17.3 Rosa
<小时/>更新:
示例: 您可以通过 this link 下载我尝试编译的代码.
说明:
- 下载压缩包
- 摘录
- 转到文件夹并只需输入 make (一切正常)
打开MakeFile并将CXX变量替换为
CXX = g++ -std=c++11
再次尝试 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_ptr
、boost::function
替换为 std::shared_ptr
和 std::function
。
此后,一切都会编译并使用 -std=c++11
标志正常工作。
nanomysql.h 的完整代码你可以在这里看到:
关于linux - 使用 boost 和 C++11 构建进程崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35309793/