elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Símbolos no encontrados para arquitectura x86/x64
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Símbolos no encontrados para arquitectura x86/x64  (Leído 2,517 veces)
digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Símbolos no encontrados para arquitectura x86/x64
« en: 23 Abril 2019, 19:28 pm »

Hola!

Estoy trabajando con QT Creator y tengo el siguiente código:

Código
  1.    struct Constants{
  2.  
  3.        static const char * DB_FILE_NAME;
  4.        static const char * DB_FULL_PATH;
  5.        static const char * DB_FULL_PATH_NAME;
  6.  
  7.        Constants();
  8.        ~Constants();
  9.  
  10.    };
  11.  
  12.    Constants::Constants(){
  13.        DB_FILE_NAME = "data.db";
  14.        DB_FULL_PATH = "./";
  15.        DB_FULL_PATH_NAME = "./data.db";
  16.    }
  17.  
  18.    Constants::~Constants(){
  19.        delete DB_FILE_NAME;
  20.        delete DB_FULL_PATH;
  21.        delete DB_FULL_PATH_NAME;
  22.    }
  23.  
  24.  
  25.  

Sin embargo, al compilar, me dice :

Código:
symbol(s) not found for architecture x86_64
linker command failed with exit code 1 (use -v to see invocation)

Definí los valores de las constantes estéticas fuera del structs debido a que tenia entendido que nunca se hacen en la misma declaración... a que puede deberse este error?

gracias.


En línea

Dungeons & dragons;
dragons.Attack();
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: Símbolos no encontrados para arquitectura x86/x64
« Respuesta #1 en: 23 Abril 2019, 19:37 pm »

No sé exactamente a qué se debe ese error, por lo que he leído puede ser un problema debido a que estés trabajando con varios ficheros y tengas un error en la orden de compilación.

Lo que sí puedo decirte es que estás guardando una cadena de <char> en unos punteros a <char> sin reservar memoria y después estás liberando esa memoria (memoria que no has reservado)... Espero que te sirva de ayuda.

Suerte :-X


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Símbolos no encontrados para arquitectura x86/x64
« Respuesta #2 en: 23 Abril 2019, 19:52 pm »

Tienes razón, se me había pasado eso de solicitar memoria ...  gracias..

El error lo he visto mas en OSX..
En línea

Dungeons & dragons;
dragons.Attack();
digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Símbolos no encontrados para arquitectura x86/x64
« Respuesta #3 en: 23 Abril 2019, 20:35 pm »

Código
  1.  
  2. struct Constants{
  3.  
  4.        static const char * DB_FILE_NAME;
  5.        static const char * DB_FULL_PATH;
  6.        static const char * DB_FULL_PATH_NAME;
  7.  
  8.        ~Constants();
  9.  
  10.    };
  11.  
  12.    //Aqui esta lo nuevo:
  13.    const char * Constants::DB_FILE_NAME = "data.db";
  14.    const char * Constants::DB_FULL_PATH = "./";
  15.    const char * Constants::DB_FULL_PATH_NAME = "./data.db";
  16.  
  17.    Constants::~Constants(){
  18.        delete DB_FILE_NAME;
  19.        delete DB_FULL_PATH;
  20.        delete DB_FULL_PATH_NAME;
  21.    }
  22.  
  23.  

Ya vi, mi error era que estaba inicializando mal, cuando los miembros son static, debo hacerlo de la forma en las lineas 13, 14 y 15.  Parece ser que la definición de los miembros estáticos es levemente diferente a la de un miembro común y corriente, porque he necesitado colocar las palabras "const char *" nuevamente, como si las estuviera declarando.

Lo otro que me di cuenta es que no he necesitado solicitar memoria dinámica (no he probado aun, puede que mi aplicación se cierre), lo cual me parece extraño, tenia entendido que todos los punteros deben solicitar memoria dinámica..  C++ es como una nena.  ;D
« Última modificación: 23 Abril 2019, 20:37 pm por digimikeh » En línea

Dungeons & dragons;
dragons.Attack();
CalgaryCorpus


Desconectado Desconectado

Mensajes: 323


Ver Perfil WWW
Re: Símbolos no encontrados para arquitectura x86/x64
« Respuesta #4 en: 23 Abril 2019, 21:16 pm »

No hagas delete de lo que no has hecho new.
En línea

Aqui mi perfil en LinkedIn, invitame un cafe aqui
digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Símbolos no encontrados para arquitectura x86/x64
« Respuesta #5 en: 23 Abril 2019, 21:40 pm »

Si cierto, otro error de mi parte, ya he quitado los deletes...

al final también quité el struct... las variables estáticas quedaron directamente fuera.. dentro de un namespace

Código:

namespace UTools{

     static const char * DB_FILE_NAME = "data.db";
     static const char * DB_FULL_PATH = "./";
     static const char * DB_FULL_PATH_NAME = "./data.db";

}


Y al parecer, char * es una excepción a la regla, es lo único que implícitamente solicita memoria dinámica, sin que yo escriba new... acabo de hacer las pruebas....

En línea

Dungeons & dragons;
dragons.Attack();
Loretz

Desconectado Desconectado

Mensajes: 117


Ver Perfil
Re: Símbolos no encontrados para arquitectura x86/x64
« Respuesta #6 en: 24 Abril 2019, 00:33 am »

Citar
Y al parecer, char * es una excepción a la regla, es lo único que implícitamente solicita memoria dinámica ...

No, no se trata de una excepción, lo que sucede es que las expresiones como "data.db" son de tipo "string literal", que tienen"static storage duration" [https://en.cppreference.com/w/c/language/static_storage_duration], por lo que existen durante toda la vida del programa y se inicializan antes de main().

Por ejemplo, el tipo de "data.db" es const char[8] (los 7 caracteres visibles más el 0 del final). Como los arrays decaen en punteros, es también natural escribir:
Código:
const char* file_name = "data.db";
Entonces, file_name es un puntero a carácter que apunta a la primera 'd' del array, se le asigna esa dirección de memoria, que ya existe, por eso es que no es necesario crearla.

Otra cosa; al declarar las variables "static", si vas a poner tu UTools en un .h, estarás haciendo que cada unidad donde se incluya (cada .cpp) tenga su propia copia de todas esas variables. En este caso son todas const char* y nadie las va a modificar, pero de todos modos creo que conviene tenerlo en cuenta.

« Última modificación: 24 Abril 2019, 00:43 am por Loretz » En línea

RayR

Desconectado Desconectado

Mensajes: 239


Ver Perfil
Re: Símbolos no encontrados para arquitectura x86/x64
« Respuesta #7 en: 24 Abril 2019, 00:45 am »

Sí, los punteros char son una excepción, pero no exactamente como piensas. Por comodidad se pueden inicializar de esa forma, pero en ningún momento se está reservando memoria dinámica.

Cuando declaras e inicializas punteros char así:

Código:
char *ptr = "hola mundo";

El compilador crea la cadena "hola mundo", y en tiempo de compilación (no dinámicamente) la almacena en un lugar de la memoria, y hace que ptr apunte a esa dirección. Y a diferencia de una cadena reservada dinámicamente, en este caso no se deben modificar sus datos. El estándar dice que intentar algo como esto: (que con cadenas reservadas dinámicamente funcionaría sin problemas)

Código:
ptr[0] = 'H';

resulta en comportamiento indefinido, es decir, el resultado es impredecible, y por eso no se debe hacer. Normalmente, se producirá un error de violación de acceso, y se cerrará tu programa. Esto se debe a que, por cuestiones de rendimiento, los compiladores suelen almacenar las cadenas literales en memoria de sólo lectura (por ejemplo, en el segmento de código/texto junto con elas instrucciones ejecutables de tu programa).

En tu caso, no tendrás problemas, ya que los estás declarando como punteros a char constante, por lo que el compilador te marcaría error si intentaras modificar sus datos, pero es importante conocer la diferencia. Si necesitas punteros dinámicos, sean o no char, no queda de otra que reservar manualmente su memoria.

Editado: Por cierto, en relación a tu error, ayudaría si pusieras el mensaje completo (el linker debería decirte cuáles símbolos no encuentra), pero seguramente se debe a que te está faltando enlazar con alguna biblioteca que estás usando.
« Última modificación: 24 Abril 2019, 01:03 am por RayR » En línea

digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: Símbolos no encontrados para arquitectura x86/x64
« Respuesta #8 en: 24 Abril 2019, 17:20 pm »

Gracias por las aclaraciones...

Estoy más claro ahora

Saludos  :D
En línea

Dungeons & dragons;
dragons.Attack();
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Wifislax para arquitectura x64
Materiales y equipos
roketa_56 0 4,377 Último mensaje 23 Julio 2010, 22:12 pm
por roketa_56
Simbolos Cargados para WIndbg?
Programación C/C++
x64core 3 2,850 Último mensaje 31 Mayo 2012, 12:13 pm
por Eternal Idol
Encontrados rastros de Keep, un nuevo servicio de Google para tomar notas
Noticias
wolfbcn 0 1,171 Último mensaje 17 Marzo 2013, 22:08 pm
por wolfbcn
Arquitectura de Von Newmann vs. Arquitectura Harvard
Hardware
m@o_614 0 2,155 Último mensaje 6 Diciembre 2013, 01:46 am
por m@o_614
Script para intercambiar símbolos en un texto
Scripting
JonaLamper 4 2,336 Último mensaje 10 Enero 2018, 16:39 pm
por fary
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines