Estoy creando una clase basada en la libreria gloox pero cuando creo un miembro de mi clase me devuelve el siguiente error:
error: cannot declare variable 'b' to be of abstract type 'Bot'|
#include "gloox/src/client.h"
#include "gloox/src/messagehandler.h"
#include "gloox/src/message.h"
#include "gloox/src/presencehandler.h"
#include "gloox/src/connectionlistener.h"
#include <ctime>
#include <iostream>
#include <string>
using namespace std;
using namespace gloox;
//my one
const string LOGIN = "gmail.com";
ostream& operator<<(ostream& os, Message::MessageType type) {
switch (type) {
case Message::Chat:
os << "Chat";
break;
case Message::Error:
os << "Error";
break;
case Message::Groupchat:
os << "Groupchat";
break;
case Message::Headline:
os << "Headline";
break;
case Message::Normal:
os << "Normal";
break;
case Message::Invalid:
os << "Invalid";
break;
default:
os << "unknown type";
break;
}
return os;
}
ostream& operator<<(ostream& os, const Message& stanza) {
os << "type:'" << stanza.subtype() << "' from:'" << stanza.from().full() << "' body:'" << stanza.body() << "'";
return os;
}
class Bot : public MessageHandler,
/*public PresenceHandler,*/
public ConnectionListener
/*,public RosterListener*/{
public:
Bot(){
JID jid( "mmaaria123@gmail.com/home" );
client = new Client( jid, "mmaaria123" );
client->registerConnectionListener( this );
client->registerMessageHandler( this );
client->connect(true);
}
virtual void onConnect() {
cout << "It is connected good:)" << endl;
//sleep(5);
client->disconnect();
}
virtual void onDisconnect(ConnectionError e) {
cout << "ConnListener::onDisconnect() " << endl;
}
/*
virtual bool onTLSConnect(const CertInfo& Info) {
time_t tm = Info.date_from;
time_t tm_to = Info.date_to;
cout << "\t Certificate information to " << LOGIN << endl;
cout << "\t========================================" << endl;
// number code << "\tServer status: " << Info.status;
if (Info.status !=0)
{
cout << "\t !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
cout << "\t !!! The certificate has a problem !!!" << endl;
cout << "\t !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!" << endl;
// parsing binary Status Cert
if ((CertInvalid) & Info.status)
{
cout << "\t- The certificate is not trusted " << endl;
}
if (( CertSignerUnknown) & Info.status)
{
cout << "\t- The certificate hasn't got a kown issuer" << endl;
}
if ((CertRevoked) & Info.status)
{
cout << "\t- The certificate has been revoked " << endl;
}
if ((CertExpired) & Info.status)
{
cout << "\t- The certificate has expired " << endl;
}
if ((CertNotActive) & Info.status)
{
cout << "\t- The certificate is not yet active " << endl;
}
if ((CertWrongPeer) & Info.status)
{
cout << "\t- The certificate has not issued for the peer we're connected to " << endl;
}
if ((CertSignerNotCa) & Info.status)
{
cout << "\t- The signer is not CA " << endl;
}
cout << endl;
}
// end parsing
else
// if Info.status=0 sertificate is valide
cout << " *** Cert is OK!" << endl;
cout << "\tChain: " << Info.chain << endl;
cout << "\tIssuer: " << Info.issuer << endl;
cout << "\tServer: " << Info.server << endl;
cout << "\tCert date from: " << ctime(&tm);
cout << "\tCert date to: " << ctime(&tm_to);
cout << "\tProtocol: " << Info.protocol << endl;
cout << "\tCipher: " << Info.cipher << endl;
cout << "\tMAC: " << Info.mac << endl;
cout << "\tCompression: " << Info.compression << endl;
cout << "\t========================================" << endl;
return true;
}
*/
virtual void handleMessage( const Message& stanza,
MessageSession* session = 0 ){
Message msg(Message::Chat, stanza.from(), "hello world" );
client->send( msg );
}
private:
Client* client;
};
int main(){
cout << "1" << endl;
Bot b;
}
No conozco la librería pero dado que la clase hereda de esas otras clases, será que hay miembros que no has definido. Por ejemplo, virtual bool onTLSConnect(const CertInfo& Info), que lo tienes comentado. Quizás sea una función virtual pura.
EDITO: Quizás no. Es una función virtual pura, según lo que vi en la referencia de la librería. https://camaya.net/api/gloox/classgloox_1_1ConnectionListener.html (https://camaya.net/api/gloox/classgloox_1_1ConnectionListener.html)
Cita de: ivancea96 en 1 Marzo 2017, 12:48 PM
No conozco la librería pero dado que la clase hereda de esas otras clases, será que hay miembros que no has definido. Por ejemplo, virtual bool onTLSConnect(const CertInfo& Info), que lo tienes comentado. Quizás sea una función virtual pura.
tengo que incluir openssl para poder usarlo pero hasta tiempo que no lo hago y nunca lo he hecho en codeblocks como podría incluir las librerías openssl para solucionar este error en codeblocks?
Primero, descargala. Si laquieres ya compilada, puedes probar desde auí: https://wiki.openssl.org/index.php/Binaries (https://wiki.openssl.org/index.php/Binaries)
Luego, toca poner las opciones de Code::Blocks. Te pongo como lo tengo yo para que te orientes:
(http://i.gyazo.com/5b382797757556469ffb97098634bbb4.png)
(http://i.gyazo.com/36d37ffb6e5663226a06157f03ff4af8.png)
(http://i.gyazo.com/e1d86399c10a12e67dc51fad162d8e8e.png)
Una pregunta ya puedo usar openssl pero porque cuando el siguiente ejemplo pongo una cabecera de openssl ej:
#include <iostream>
#include <aes.h>
using namespace std;
int main()
{
cout << "Hello world!" << endl;
return 0;
}
Incluyo esta cabecera:
#include <aes.h>
Me devuelve este error gracias por su ayuda:
||=== Build: Debug in main (compiler: GNU GCC Compiler) ===|
C:\openssl-1.0.1c_static_w32_mingw\include\openssl\aes.h|55|fatal error: openssl/opensslconf.h: No such file or directory|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
El error es auto-explicativo. Esa cabecera tiene un include dentro que parece no existir.
Mira el código de la cabecera, mira e include, y mira si existe. Si existe, tal vez hayas puesto algo mal en la configuración del IDE al compilar.
Aunque bueno, alerta spoiler:
Probablemente pusiste que el directorio de los includes es "include/openssl". Eso es incorrecto. El directorio de los include es "include", sin más.
Para incluir cabeceras de OpenSSL, tienes que poner "#include <openssl/...>". Por ejemplo, #include <openssl/aes.h>
Si ves el código de la cabecera del error, verás que tiene un: #include <openssl/opensslconf.h>
Este es el error que me aparece en mingw:
||=== Build: Debug in main (compiler: GNU GCC Compiler) ===|
C:\openssl-1.0.1c_static_w32_mingw\include\openssl\aes.h|55|fatal error: openssl/opensslconf.h: No such file or directory|
||=== Build failed: 1 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|
En VS, click derecho en el proyecto, propiedades.
Ahí tienes, dentor de "Configuration properties", la pestaña "C/C++ -> General". Dentro de esta, Additional include directories.
Luego, para el linker, si el proyecto se va a linkear, debajo de "C/C++", tienes "Linker". Ene sta, teines "General" también. Ahí, "Additional library dependencies". Luego, en "Linker -> Input", tienes "Additional dependencies".
Cita de: ivancea96 en 12 Marzo 2017, 16:33 PM
El error es auto-explicativo. Esa cabecera tiene un include dentro que parece no existir.
Mira el código de la cabecera, mira e include, y mira si existe. Si existe, tal vez hayas puesto algo mal en la configuración del IDE al compilar.
Aunque bueno, alerta spoiler:
Probablemente pusiste que el directorio de los includes es "include/openssl". Eso es incorrecto. El directorio de los include es "include", sin más.
Para incluir cabeceras de OpenSSL, tienes que poner "#include <openssl/...>". Por ejemplo, #include <openssl/aes.h>
Si ves el código de la cabecera del error, verás que tiene un: #include <openssl/opensslconf.h>
Pero si esque te fijas yo tengo las cabeceras dentro del directorio openssl que esta dentro del directorio include por eso puse esa ruta o estaría mal? Gracias!
En directorio de includes, debes poner "include", no "include/openssl". Sí, las cabeceras están en "include/openssl", pero accedes a ellas poniendo #include <openssl/aes.h>.
Esto se hace o para diferenciar diferentes librerías que puedan tener cabeceras con el mismo nombre, o separar en carpetas, sin más. En cualquier caso, y de forma general, siempre pondrás como directorio "include", y no la carpeta que pueda tener dentro. Además, en este caso estás casi obligado, ya que las propias cabeceras utilizan la fórmula #include <openssl/aes.h>.
Cita de: ivancea96 en 12 Marzo 2017, 17:39 PM
En directorio de includes, debes poner "include", no "include/openssl". Sí, las cabeceras están en "include/openssl", pero accedes a ellas poniendo #include <openssl/aes.h>.
Esto se hace o para diferenciar diferentes librerías que puedan tener cabeceras con el mismo nombre, o separar en carpetas, sin más. En cualquier caso, y de forma general, siempre pondrás como directorio "include", y no la carpeta que pueda tener dentro. Además, en este caso estás casi obligado, ya que las propias cabeceras utilizan la fórmula #include <openssl/aes.h>.
Vale ahora lo entendi que tengo que poner en search directories compiler la ruta include es decir C:\openssl-1.0.1c_static_w32_mingw\include para que me coja openssl/cabecera.h solo que en mi proyecto tendre que indicarlo de esta manera:
#include <openssl/aes.h>
Ahora me queda mucho más claro. Revisare en visual y te comento me resolvistes el problema gracias.
Cita de: ivancea96 en 12 Marzo 2017, 17:28 PM
En VS, click derecho en el proyecto, propiedades.
Ahí tienes, dentor de "Configuration properties", la pestaña "C/C++ -> General". Dentro de esta, Additional include directories.
Luego, para el linker, si el proyecto se va a linkear, debajo de "C/C++", tienes "Linker". Ene sta, teines "General" también. Ahí, "Additional library dependencies". Luego, en "Linker -> Input", tienes "Additional dependencies".
Vale en visual studio lo inclui asi:
(https://i.imgsafe.org/58c79f0fb9.png)
(https://i.imgsafe.org/590180d166.png)
Pero me devuelve el siguiente error:
Error 30 error LNK1181: no se puede abrir el archivo de entrada 'ssleay32' C:\Users\moh\Desktop\gloox\LINK gloox-1.0
Y apunta aqui:
#include <openssl/sha.h>
Pero lo apunte como me dijistes poniendo solamente include no se el motivo de este error. Gracias por tu ayuda!
No en using, en inclusión. Directorios de inclusión.
funciono gracias
abri otro post ya que este es antiguo y no lo puedo poner otra vez para resolverlo