我剛開始使用libjingle編寫一個gtalk聊天工具。我遇到了一個問題,讓編譯器找到由XmppPump類調用的XmppClient類。 XmppClient由talk/xmpp/xmppclient.h文件中的libjingle提供,但由於某種原因,它不適用於我,最近令我感到沮喪。希望你們能幫助我!libjingle的XmppPump編譯問題
我正在使用libjingle-0.5.1,而我的g ++編譯器版本是4.4.5。我的操作系統是Ubuntu 10.10,32位。
以下是我想要編譯我的代碼:
g++ -g -Werror -DPOSIX -DEXPAT_RELATIVE_PATH -DFEATURE_ENABLE_SSL -DHAVE_OPENSSL_SSL_H=1 -I../include -I../misc/libjingle-0.5.1 -I../misc/libjingle-0.5.1/talk/third_party/expat-2.0.1 -I../misc/libjingle-0.5.1/talk/third_party/srtp/include -L../lib -lpthread -lssl -o ../bin/gtalk_bot.bin ../obj/main.o /usr/local/lib/libglog.a ../misc/libjingle-0.5.1/talk/build/dbg/lib/libjingle.a ../misc/libjingle-0.5.1/talk/build/dbg/lib/libexpat.a ../misc/libjingle-0.5.1/talk/build/dbg/lib/libsrtp.a ../misc/libjingle-0.5.1/talk/build/dbg/lib/libxmpphelp.a
這裏的錯誤消息:
../misc/libjingle-0.5.1/talk/build/dbg/lib/libxmpphelp.a(xmpppump.o): In function `XmppPump::XmppPump(XmppPumpNotify*)': xmpppump.cc:(.text._ZN8XmppPumpC2EP14XmppPumpNotify+0x6e): undefined reference to `buzz::XmppClient::XmppClient(talk_base::TaskParent*)' ../misc/libjingle-0.5.1/talk/build/dbg/lib/libxmpphelp.a(xmpppump.o): In function `XmppPump::XmppPump(XmppPumpNotify*)': xmpppump.cc:(.text._ZN8XmppPumpC1EP14XmppPumpNotify+0x6e): undefined reference to `buzz::XmppClient::XmppClient(talk_base::TaskParent*)' ../misc/libjingle-0.5.1/talk/build/dbg/lib/libxmpphelp.a(xmpppump.o): In function `XmppPump::DoLogin(buzz::XmppClientSettings const&, buzz::AsyncSocket*, buzz::PreXmppAuth*)': xmpppump.cc:(.text._ZN8XmppPump7DoLoginERKN4buzz18XmppClientSettingsEPNS0_11AsyncSocketEPNS0_11PreXmppAuthE+0xa9): undefined reference to `buzz::XmppClient::Connect(buzz::XmppClientSettings const&, std::basic_string, std::allocator > const&, buzz::AsyncSocket*, buzz::PreXmppAuth*)' ../misc/libjingle-0.5.1/talk/build/dbg/lib/libxmpphelp.a(xmpppump.o): In function `XmppPump::DoDisconnect()': xmpppump.cc:(.text._ZN8XmppPump12DoDisconnectEv+0x25): undefined reference to `buzz::XmppClient::Disconnect()' ../misc/libjingle-0.5.1/talk/build/dbg/lib/libxmpphelp.a(xmpppump.o): In function `XmppPump::SendStanza(buzz::XmlElement const*)': xmpppump.cc:(.text._ZN8XmppPump10SendStanzaEPKN4buzz10XmlElementE+0x2c): undefined reference to `buzz::XmppClient::SendStanza(buzz::XmlElement const*)' collect2: ld returned 1 exit status make: *** [../bin/gtalk_bot.bin] Error 1
這裏是我的代碼:
#include <string>
#include <iostream>
#include <assert.h>
#include <getopt.h>
#include "glog/logging.h"
#include "talk/base/thread.h"
#include "talk/base/physicalsocketserver.h"
#include "talk/base/socketaddress.h"
#include "talk/base/cryptstring.h"
#include "talk/base/ssladapter.h"
#include "talk/xmpp/jid.h"
#include "talk/xmpp/xmppclient.h"
#include "talk/xmpp/xmppclientsettings.h"
#include "talk/examples/login/xmpppump.h"
#include "talk/examples/login/xmppauth.h"
#include "talk/examples/login/xmppthread.h"
using namespace std;
int readCommandLineArguments(int argc, char **argv);
int getUserName(string *username);
int getPassword(string *password);
buzz::Jid serverJid;
string username;
string password;
string auth_cookie;
int main(int argc, char **argv){
int status = 0;
// use: GLOG_log_dir="log" ./gtalk_bot.bin
google::InitGoogleLogging(argv[0]);
talk_base::PhysicalSocketServer pss;
talk_base::AutoThread main_thread(&pss);
// Get the information we'll need to sign in
buzz::Jid jid;
talk_base::InsecureCryptStringImpl pass;
buzz::XmppClientSettings xcs;
XmppPump pump;
//XmppHandler xhandler;
status = readCommandLineArguments(argc, argv);
if(username.empty()){
// get the user name if there's none in the command line argument
status = getUserName(&username);
}
jid = buzz::Jid(username);
assert(jid.IsValid() || jid.node() != "");
if(!username.empty() && password.empty()){
// If username is provided, but the password isn't, ask for one.
status = getPassword(&password);
}
pass.password() = password;
// Turn on SSL
talk_base::InitializeSSL();
xcs.set_user(jid.node());
xcs.set_resource("one_chat_bot"); //TODO: need to investigate what this is
xcs.set_host(jid.domain());
xcs.set_use_tls(true);
xcs.set_pass(talk_base::CryptString(pass));
xcs.set_server(talk_base::SocketAddress("talk.google.com", 5222));
//xhandler.DoLogin(xcs, new XmppSocket(true), NULL);
// xhandler.DoLogin(xcs, new XmppSocket(true), NULL);
main_thread.Run();
// xhandler.DoDisconnect();
//delete objects here
return 0;
}
int readCommandLineArguments(int argc, char **argv){
int input = 0;
int rc = 0;
int options_index = 0;
static struct option long_options[] = {
{"username", required_argument, 0, 'u'},
{"password", required_argument, 0, 'p'},
{0, 0, 0, 0}
};
while((input = getopt_long(argc, argv, "u:p:", long_options, &options_index)) != -1 && rc == 0){
switch(input){
case 'u':
if(optarg){
username = optarg;
}
break;
case 'p':
if(optarg){
password = optarg;
}
break;
case '?':
default:
rc = 1;
break;
}
}
return rc;
}
int getUserName(string *username){
int rc = 0;
cout << "google username: ";
cin >> *username;
return rc;
}
int getPassword(string *password){
int rc = 0;
cout << "password: ";
cin >> *password;
return rc;
}
這裏是我的目錄結構。有三個libjingle文件夾,因爲我在試驗和嘗試不同的事情,以查看我是否可以解決編譯問題。除了將expat-2.0.1 /和srtp /文件夾複製到libjingle/talk/third_party /文件夾之外,libjingle文件夾保持不變。該設的Libjingle-0.5.1 /目錄結構幾乎是一樣設在這裏的SVN主幹:
http://code.google.com/p/libjingle/source/browse/trunk/#trunk
除了我設的Libjingle-0.5.1的文件夾已經編譯。
gtalk_bot$ ls * bin: log include: lib: misc: expat-2.0.1 glog-0.3.1.tar.gz libjingle-0.4.0.tar.gz libjingle-0.5.1 libjingle-0.5.tar.gz srtp swtoolkit expat-2.0.1.tar.gz libjingle-0.4.0 libjingle-0.5 libjingle-0.5.1.zip scons-2.0.1.tar.gz srtp-1.4.4.tgz swtoolkit.0.9.1.zip obj: main.o XmppHandler.o src: main.cc main.o Makefile SConstruct XmppHandler.cc XmppHandler.h XmppSocket.cc XmppSocket.h test:
這裏是設的Libjingle的build目錄:
gtalk_bot/misc/libjingle-0.5.1/talk/build/dbg$ ls * lib: libexpat.a libjingle.a libsrtp.a libxmpphelp.a obj: base call examples libexpat.a libjingle.a libsrtp.a libxmpphelp.a login p2p relayserver session stunserver third_party xmllite xmpp staging: call login relayserver stunserver
如果你能爲我們提供目錄結構 – Alam 2010-11-16 05:10:58
好了,我添加了目錄結構。希望它會有所幫助。一定要檢查libjingle SVN中繼鏈接以檢查目錄結構以及標題和源文件的駐留位置。 – nikeairj 2010-11-16 06:23:11