C++在windows平台下利用thrift通信

在windows下使用C++和Thrift开发客户端程序与HBase进行通信,总是实现不了。
已经安装了thrift所依赖的boost,libevent,openssl底层东西,也成功编译出了libthrift.lib和libthriftnb.lib两个lib库。
客户端程序添加引用如下:
1.在C++/常规/附加包含目录中添加对头文件的引用:C:\openssl\include;C:\libevent\include;C:\boost\include;E:\HBase\thrift-0.9.3\lib\cpp\src;E:\HBase\thrift-0.9.3\lib\cpp\src\thrift。
2.在链接器/常规/附加库目录中添加库文件目录:C:\openssl\out32dll;C:\libevent\libs;C:\boost\libs;E:\HBase\thrift-0.9.3\lib\cpp\Debug
3.在链接器/输入/附加依赖项中添加对libthrift.lib和libthriftnb.lib两个lib库的引用

但是在创建客户端引用的过程中总是报错:

错误 2 error LNK2019: 无法解析的外部符号 "public: void __thiscall apache::thrift::TOutput::perror(char const *,int)" (?perror@TOutput@thrift@apache@@QAEXPBDH@Z),该符号在函数 "protected: void __thiscall apache::thrift::transport::TSocket::openConnection(struct addrinfo *)" (?openConnection@TSocket@transport@thrift@apache@@IAEXPAUaddrinfo@@@Z) 中被引用 E:\HBase\thrift-0.9.3\lib\cpp\CppDemo\libthrift.lib(TSocket.obj) CppDemo

错误 3 error LNK2019: 无法解析的外部符号 "public: static class std::basic_string,class std::allocator > __cdecl apache::thrift::TOutput::strerror_s(int)" (?strerror_s@TOutput@thrift@apache@@SA?AV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z),该符号在函数 "public: __thiscall apache::thrift::transport::TTransportException::TTransportException(enum apache::thrift::transport::TTransportException::TTransportExceptionType,class std::basic_string,class std::allocator > const &,int)" (??0TTransportException@transport@thrift@apache@@QAE@W4TTransportExceptionType@0123@ABV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@H@Z) 中被引用 E:\HBase\thrift-0.9.3\lib\cpp\CppDemo\libthrift.lib(TSocket.obj) CppDemo

程序代码如下:
#include "stdafx.h"
#include
#include
#include
#include
#include
#include
using namespace std;
using namespace ::apache::thrift;
using namespace ::apache::thrift::protocol;
using namespace ::apache::thrift::transport;
using namespace ::apache::thrift::server;
using boost::shared_ptr;

int _tmain(int argc, _TCHAR* argv[])
{
boost::shared_ptr socket(new TSocket("127.0.0.1", 9090));
return 0;
}

各位大神,可有办法?急...

3个回答

报错的perror和strerror_s都是在Thrift.h里的

00001 /*
00002  * Licensed to the Apache Software Foundation (ASF) under one
00003  * or more contributor license agreements. See the NOTICE file
00004  * distributed with this work for additional information
00005  * regarding copyright ownership. The ASF licenses this file
00006  * to you under the Apache License, Version 2.0 (the
00007  * "License"); you may not use this file except in compliance
00008  * with the License. You may obtain a copy of the License at
00009  *
00010  *   http://www.apache.org/licenses/LICENSE-2.0
00011  *
00012  * Unless required by applicable law or agreed to in writing,
00013  * software distributed under the License is distributed on an
00014  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
00015  * KIND, either express or implied. See the License for the
00016  * specific language governing permissions and limitations
00017  * under the License.
00018  */
00019 
00020 #ifndef _THRIFT_THRIFT_H_
00021 #define _THRIFT_THRIFT_H_ 1
00022 
00023 #ifdef HAVE_CONFIG_H
00024 #include "config.h"
00025 #endif
00026 #include <stdio.h>
00027 
00028 #include <sys/types.h>
00029 #include <netinet/in.h>
00030 #ifdef HAVE_INTTYPES_H
00031 #include <inttypes.h>
00032 #endif
00033 #include <string>
00034 #include <map>
00035 #include <list>
00036 #include <set>
00037 #include <vector>
00038 #include <exception>
00039 
00040 #include "TLogging.h"
00041 
00042 namespace apache { namespace thrift {
00043 
00044 class TOutput {
00045  public:
00046   TOutput() : f_(&errorTimeWrapper) {}
00047 
00048   inline void setOutputFunction(void (*function)(const char *)){
00049     f_ = function;
00050   }
00051 
00052   inline void operator()(const char *message){
00053     f_(message);
00054   }
00055 
00056   // It is important to have a const char* overload here instead of
00057   // just the string version, otherwise errno could be corrupted
00058   // if there is some problem allocating memory when constructing
00059   // the string.
00060   void perror(const char *message, int errno_copy);
00061   inline void perror(const std::string &message, int errno_copy) {
00062     perror(message.c_str(), errno_copy);
00063   }
00064 
00065   void printf(const char *message, ...);
00066 
00067   inline static void errorTimeWrapper(const char* msg) {
00068     time_t now;
00069     char dbgtime[26];
00070     time(&now);
00071     ctime_r(&now, dbgtime);
00072     dbgtime[24] = 0;
00073     fprintf(stderr, "Thrift: %s %s\n", dbgtime, msg);
00074   }
00075 
00077   static std::string strerror_s(int errno_copy);
00078 
00079  private:
00080   void (*f_)(const char *);
00081 };
00082 
00083 extern TOutput GlobalOutput;
00084 
00085 class TException : public std::exception {
00086  public:
00087   TException() {}
00088 
00089   TException(const std::string& message) :
00090     message_(message) {}
00091 
00092   virtual ~TException() throw() {}
00093 
00094   virtual const char* what() const throw() {
00095     if (message_.empty()) {
00096       return "Default TException.";
00097     } else {
00098       return message_.c_str();
00099     }
00100   }
00101 
00102  protected:
00103   std::string message_;
00104 
00105 };
00106 
00107 
00108 // Forward declare this structure used by TDenseProtocol
00109 namespace reflection { namespace local {
00110 struct TypeSpec;
00111 }}
00112 
00113 
00114 }} // apache::thrift
00115 
00116 #endif // #ifndef _THRIFT_THRIFT_H_
Generated on Tue Jan 24 2012 16:03:28 for TDAQ release tdaq-04-00-01 by   doxygen 1.7.2
blockBTC
blockBTC 请问怎么解决的老哥,求
一年多之前 回复
jiaruya
牧羊少年123 回复小灸舞: 有的,是没显示出来
4 年多之前 回复
jiaruya
牧羊少年123 kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;libthrift.lib;libthriftnb.lib;%(AdditionalDependencies)
4 年多之前 回复
jiaruya
牧羊少年123 kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;libthrift.lib;libthriftnb.lib;%(AdditionalDependencies)
4 年多之前 回复
qq423399099
小灸舞 回复牧羊少年123: 附加依赖项没看到libthrift.lib和libthriftnb.lib啊?
4 年多之前 回复
jiaruya
牧羊少年123 回复小灸舞: 附加包含目录:C:\openssl\include;C:\libevent\include;C:\boost\include;E:\HBase\thrift-0.9.3\lib\cpp\src;E:\HBase\thrift-0.9.3\lib\cpp\src\thrift 附加库目录:C:\openssl\out32dll;C:\libevent\libs;C:\boost\libs;E:\HBase\thrift-0.9.3\lib\cpp\Debug 附加依赖项:kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;libthrift.lib;libthriftnb.lib;%(AdditionalDependencies)
4 年多之前 回复
qq423399099
小灸舞 回复牧羊少年123: 这样的链接错误肯定是配置有问题啊,楼主要不贴一下附加库目录和附加依赖项
4 年多之前 回复
jiaruya
牧羊少年123 然后呢?改怎么处理啊,能具体点吗?大神指教
4 年多之前 回复

你这还是link的error,也就是你用的一些thift的库函数没有找到实现,也就是lib还是没有正确link对

blockBTC
blockBTC 回复牧羊少年123: 我也一样 ‘怎么解决的老哥’
一年多之前 回复
oyljerry
oyljerry 是否是thrift编译生成的debug版本
4 年多之前 回复
jiaruya
牧羊少年123 嗯,谢谢你的回答!我也怀疑是这个原因。但是改怎么正确添加lib呢,我在“附加库目录”里面已经把所有要用到的lib路径都包含进去了,并且在链接器输入那里把thrift生成的"libthrift.lib"和"libthriftnb.lib"也添加进去了...
4 年多之前 回复

附加依赖项:kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;libthrift.lib;libthriftnb.lib;%(AdditionalDependencies)

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问
相关内容推荐