“Símbolo (s) no encontrados para la architecture x86_64” en el proyecto QtCreator

Me sale el error

Symbol(s) not found for architecture x86_64 

Intentando comstackr un proyecto en QtCreator. Sucede cuando bash crear una instancia de una clase definida por el usuario, Layer . Esa clase consiste en un encabezado, layer.h , y una implementación, layer.cpp . Fue probado y funciona en otros progtwigs. En mi proyecto, está incluido en qtwidget.h y el error ocurre cuando bash usarlo en qtwidget.cpp . Por ejemplo:

 Layer text("pq.txt",0.5,0.5,0.5); 

Tener esta línea en qtwidget.cpp es suficiente para que aparezca el error.

Este es un error tan genérico que no tengo ni idea de cómo aislarlo más, pero si ayuda, he incluido todo el proyecto en este git repo .

En mi opinión, el mensaje de error que muestra Qt Creator es bastante engañoso hasta que lo comprenda, pero no impide dividir la clase de plantilla en un encabezado y archivo de implementación. Si piensas en el mensaje:

 Symbol(s) not found for architecture x86_64 

el problema, originalmente pensé cuando vi esto, es que expresa este error por sí solo en la salida de Issues y puede llevar al usuario a pensar que el problema se debe a la architecture. En realidad, todo lo que dice es que hay un símbolo definido (a menudo función) cuya implementación coincidente no se encontró.

Si cambia de Issues a la ventana de salida de comstackción y se desplaza hacia arriba, podrá ver exactamente qué símbolos no se pueden encontrar; el mío se muestra en rojo. Es molesto que el detalle de los símbolos faltantes no aparezca en la vista de Problemas .

Es fácil replicar este error simplemente agregando una definición de función en un encabezado y sin implementar la función, llámelo desde el archivo .cpp. Luego verá algo como esto en la ventana de Problemas

símbolo no encontrado

Cambiar a la vista de comstackción de salida y desplazarse hacia arriba muestra esto: –

enter image description here

Así que ahora vemos que el problema real es que la función DoSomeStuff en la clase llamada PGGui se llama desde el constructor PGGui :: PGGui, pero el cuerpo de DoSomeStuff falta, ya que su símbolo no se encuentra.

Afortunadamente, he logrado resolver mi problema antes de obtener alguna respuesta, por lo tanto, si alguien experimenta algo similar, el problema es que parece que no se puede dividir una clase con plantilla en un archivo .cpp y .h . Poner todas las declaraciones del archivo .cpp nuevo en el .h resolvió el problema.

Sin embargo, todavía tenía un problema sobrante: símbolos duplicados (que fue la razón por la que lo dividí). Esta vez, declarar una variable como external en .h , y redeclarla sin la palabra clave external en uno (y solo uno) archivo .cpp resolvió el problema para siempre.

Para mí, este problema se debe a que no se volvió a generar el archivo make después de agregar otro archivo fuente y encabezado.

En Build: Cleanall-> run qMake-> run

arregló el error para mí

El problema en mi caso era que tenía un proyecto con muchos subproyectos y uno de los archivos pro de los subproyectos estaba vacío.

Para mí, olvidé escribir el nombre del objeto de clase al declarar la función en el archivo .cpp.

incorrecto: int Zero(int &num)

Derecha: int Common2::Zero(int &num)

Donde Common2 es la clase.