[ https://issues.apache.org/jira/browse/HBASE-25448?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17870467#comment-17870467 ]
Pankaj Kumar commented on HBASE-25448: -------------------------------------- [~godismortal] We also observed this failure, how did you solve this issue? > c++库编译不通过 > --------- > > Key: HBASE-25448 > URL: https://issues.apache.org/jira/browse/HBASE-25448 > Project: HBase > Issue Type: Bug > Components: Thrift > Environment: > thrift编译环境:msys2,按照thrift中READE-MSYS2.md中的说明,使用pacman安装的依赖环境, > $ pacman --needed -S bison flex make mingw-w64-x86_64-openssl \ > mingw-w64-x86_64-boost mingw-w64-x86_64-cmake \ > mingw-w64-x86_64-toolchain mingw-w64-x86_64-zlib > 安装后为gcc10.2,64位mingw-toolchain,boost1.74 > 测试工程环境:windows10,Qt5.12.9,64位Mingw7.3.0,boost1.75 > Reporter: lichaozhong > Priority: Critical > > 我用自己在msys下编译了thrift0.13.0版本的lib库和compiler,用生成的compiler用当前github上最新的thrift2中的hbase.thrift文件生成了c++连接hbase的代码,然后在windows下用QtCreator建立了一个测试工程尝试编译,出现了两个错误: > 1. > {code:java} > struct TKeepDeletedCells > { > enum type { > FALSE = 0, //此处报错:error: expected identifier before numeric constant > TRUE = 1, > TTL = 2 }; > };{code} > 错误堆栈: > {code:java} > In file included from > D:/Apps/Qt/Qt5.12.9/Tools/mingw730_64/x86_64-w64-mingw32/include/windef.h:8:0, > from > D:/Apps/Qt/Qt5.12.9/Tools/mingw730_64/x86_64-w64-mingw32/include/windows.h:69, > from > D:/Apps/Qt/Qt5.12.9/Tools/mingw730_64/x86_64-w64-mingw32/include/winsock2.h:23, > from > ..\..\TestBoost\include/thrift/transport/PlatformSocket.h:26, > from ..\..\TestBoost\include/thrift/Thrift.h:23, > from ..\..\TestBoost\hbase-thrift2-13\Hbase_types.h:12, > from ..\..\TestBoost\hbase-thrift2-13\Hbase_constants.h:10, > from ..\..\TestBoost\hbase-thrift2-13\Hbase_constants.cpp:7: > ..\..\TestBoost\hbase-thrift2-13\Hbase_types.h:151:17: error: expected > identifier before numeric constant > enum type { FALSE = 0, TRUE = 1, TTL = 2 }; > ^{code} > 错误原因:windef.h引用了头文件minwindef.h,其中对TRUE,FALSE进行了宏定义,导致此处不是一个有效的变量名 > {code:java} > #ifndef FALSE > #define FALSE 0 > #endif > #ifndef TRUE > #define TRUE 1 > #endif{code} > 我在struct TKeepDeletedCells前增加了 > {code:java} > #UNDEF TRUE > #UNDEF FALSE{code} > 规避该问题 > 2. > D:\Apps\Qt\Qt5.12.9\Tools\mingw730_64\lib\gcc\x86_64-w64-mingw32\7.3.0\include\c++\bits\stl_function.h:386: > error: undefined reference to > `apache::hadoop::hbase::thrift2::TServerName::operator<(apache::hadoop::hbase::thrift2::TServerName > const&) const' > thrift生成的TServerName定义只给出了操作符定义,并未实现 > bool operator<(const TServerName &) const; > 导致调用报错,不过我并未找到在哪里调用的<操作符,不过TServerName被放到了std:vector中,可能是vector中的函数调用了它 > 我增加了该操作符的实现就可以编译通过了 > {code:java} > bool operator<(const TServerName &rhs) const { return startCode < > rhs.startCode; }; > {code} > -- This message was sent by Atlassian Jira (v8.20.10#820010)