2010-11-16 105 views
2

我剛開始使用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 
+0

如果你能爲我們提供目錄結構 – Alam 2010-11-16 05:10:58

+0

好了,我添加了目錄結構。希望它會有所幫助。一定要檢查libjingle SVN中繼鏈接以檢查目錄結構以及標題和源文件的駐留位置。 – nikeairj 2010-11-16 06:23:11

回答

1

許多感謝設的Libjingle團隊解決我的問題。顯然,靜態庫的排序很重要。我不得不重新排序庫:

libxmpphelp.a libjingle.a libexpat.a libsrtp.a 

請參閱「男人LD」:

連接器將搜索歸檔只是 一次,在其被 在指定的位置命令行。如果 存檔定義這是 在一些物體 的 命令行上的歸檔之前出現未定義一個符號,鏈接器將包括 從 存檔適當的文件(多個)。但是, 命令行中稍後出現的對象中的未定義符號 不會導致鏈接器 再次搜索歸檔。

現在,我可以編譯我的應用程序。希望別人會覺得這很有用。

+0

另外,你可能想添加-frtti到CCFlags。爲我工作。 – steipete 2011-07-03 13:05:24

+0

@Randall:ld有--start-group和-end-group選項,當兩個庫互相依賴時,解決這些問題時可以稍微不痛苦。 – qdii 2012-02-16 23:34:27