Frage

I Codierung eines gtalk Chat-Bot mit libjingle gerade begonnen. Ich habe ein Problem bekommen, den Compiler die XmppClient Klasse von XmppPump Klasse aufgerufen zu finden. Die XmppClient wird durch libjingle im Gespräch zur Verfügung gestellt / XMPP / xmppclient.h Datei, aber aus irgendeinem Grund funktioniert es nicht für mich und es hat sich in letzter Zeit mich war frustrierend. Hoffentlich euch in der Lage, mir zu helfen!

Ich verwende libjingle-0.5.1 und meine g ++ Compiler-Version ist 4.4.5. Mein Betriebssystem ist Ubuntu 10.10, 32-bit.

Hier ist, wie ich versuche, meinen Code zu kompilieren:

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

Hier ist die Fehlermeldung:

../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

Und hier ist mein Code:

#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;
}

Hier ist meine Verzeichnisstruktur. Es gibt drei libjingle Ordner, weil ich zu experimentieren und versuchen, verschiedene Dinge zu sehen, ob ich die Zusammenstellung Problem lösen kann. Die libjingle Ordner sind unverändert, außer dass Expat-2.0.1 / und SRTP / Ordner werden auf die libjingle / Sprech kopiert / third_party / Ordner. Die libjingle-0.5.1 / Verzeichnisstruktur ist so ziemlich das gleiche wie das svn trunk hier zu finden:

http://code.google.com/p/libjingle / source / browse / trunk / # Stamm

Außer, dass mein libjingle-0.5.1-Ordner bereits kompiliert wird.

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:

Hier ist die Build des libjingle Verzeichnis:

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
War es hilfreich?

Lösung

Vielen Dank an das Team libjingle für mein Problem zu lösen. Offensichtlich ist die statische Bibliothek Bestellung wichtig. Ich musste einfach wieder um die Bibliotheken zu:

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

Siehe "Mann ld":

Der Linker wird ein Archiv sucht nur einmal an der Stelle, wo es ist in der Befehlszeile angegeben. wenn die Archiv definiert ein Symbol, das war in einem Objekt spezifiziert die erschien vor dem Archiv auf dem Befehlszeile, wird der Linker umfassen die entsprechende Datei (en) aus dem Archiv. Doch ein undefiniertes Symbol in einem Objekt erscheint später auf dem Befehlszeile wird nicht den Linker verursachen das Archiv suchen wieder.

Nun, ich bin in der Lage meine app zu kompilieren. Hoffnung jemand anderes finden diese nützlich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top