gpt4 book ai didi

c++ - "thrift -gen cpp"生成的代码无法在 macOS : 'boost/tr1/functional.hpp' file not found 上编译

转载 作者:行者123 更新时间:2023-11-30 00:43:50 25 4
gpt4 key购买 nike

我使用的是 macOS High Sierra 10.13.6

我安装的thrift如下:

$ brew install thrift

是以下版本:

$ thrift --version
Thrift version 0.11.0

我安装的boost如下:

$ brew install boost

我有以下 model.thrift 文件:

struct Person {
1: required i32 age;
}

我运行Thrift编译器生成cpp代码如下:

$ thrift -gen cpp model.thrift

我必须遵循包含生成代码的 cpp_encode.cpp 文件:

#include "gen-cpp/model_types.h"

int main(int argc, char const *argv[])
{
return 0;
}

我尝试按如下方式编译文件:

$ g++ -Wall -I /usr/local/include -L /usr/local/lib -o cpp_encode cpp_encode.cpp

编译版本如下:

 $ g++ --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 9.1.0 (clang-902.0.39.2)
Target: x86_64-apple-darwin17.7.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

我得到以下编译错误:

 $ g++ -Wall -I /usr/local/include -L /usr/local/lib -o cpp_encode cpp_encode.cpp
In file included from cpp_encode.cpp:1:
In file included from ./gen-cpp/model_types.h:14:
In file included from /usr/local/include/thrift/TBase.h:24:
In file included from /usr/local/include/thrift/protocol/TProtocol.h:28:
In file included from /usr/local/include/thrift/transport/TTransport.h:24:
/usr/local/include/thrift/stdcxx.h:32:10: fatal error: 'boost/tr1/functional.hpp' file not found
#include <boost/tr1/functional.hpp>

目录/usr/local/boost目录存在:

$ ls -1 /usr/local/include/boost
accumulators
algorithm
align
align.hpp
aligned_storage.hpp
any.hpp
archive
[...]

但是目录/usr/local/include/boost/tr1不存在:

$ ls -1 /usr/local/include/boost/tr1
ls: /usr/local/include/boost/tr1: No such file or directory

我应该安装/usr/local/include/boost/tr1 吗?如果是,怎么办?

我应该以不同的方式使用 Thrift 吗?

最佳答案

您可以查看导致包含boost/tr1/functional 的代码在 thrift/stdcxx.h

#if defined(BOOST_NO_CXX11_HDR_FUNCTIONAL) || (defined(_MSC_VER) \
&& _MSC_VER < 1800) || defined(FORCE_BOOST_FUNCTIONAL)
#include <boost/tr1/functional.hpp>
#define _THRIFT_FUNCTIONAL_TR1_ 1
#endif

因为我们可以安全地假设您的 MacOS g++ 没有定义 _MSC_VER只剩下两个选项之一:要么你自己定义了 FORCE_BOOST_FUNCTIONAL宏(不太可能),或 BOOST_NO_CXX11_HDR_FUNCTIONAL未定义。

通过查看 boost config documentation我们发现BOOST_NO_CXX11_HDR_FUNCTIONAL定义时

The standard library does not provide a C++11 compatible version of < functional >.

因为我不知道苹果的 LLVM 版本如何映射到真正的 LLVM 版本,所以我无法判断你的 clang 版本是否默认启用了 C++11,但我最好的猜测是你需要手动启用它.唯一的另一种选择是存在一个 boost 配置错误,该错误导致 clang 被识别为不具有 C++11 <functional> .

要测试你的clang版本是否默认启用了C++11,你可以尝试编译一个包含以下内容的文件

int main() 
{
return []() -> int { return 0; }
}

不设置任何编译器标志。

总结一下:

  • 检查您(或除 thrift 之外您使用的第三方库)是否定义了 FORCE_BOOST_FUNCTIONAL宏观
  • 检查你的编译器是否默认支持C++11,如果不支持添加-std=c++11到编译器标志列表
  • 如果两者都不是,请尝试升级您的 Boost 版本,也许更新的版本会正确识别您的编译器支持 C++11 函数
  • 否则,使用 boost.config 提交错误。

关于c++ - "thrift -gen cpp"生成的代码无法在 macOS : 'boost/tr1/functional.hpp' file not found 上编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52340266/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com