I'm getting the error
Symbol(s) not found for architecture x86_64
Trying to compile a project on QtCreator. It happens when I try to create an instance of an user defined class, Layer
. That class consists of a header, layer.h
, and a implementation, layer.cpp
. It was tested and works in another programs. On my project, it is included in qtwidget.h
and the error happens when I try to use it on qtwidget.cpp
. For example:
Layer<double> text("pq.txt",0.5,0.5,0.5);
Having this line on qtwidget.cpp
is enough for the error to show up.
This is such a generic error that I'm clueless on how to isolate it any further, but if it helps, I've included the whole project on this git repo.
In my opinion, the error message that Qt Creator displays is quite misleading until you understand it, but does not prevent splitting the template class into a header and implementation file. If you think about the message:
Symbol(s) not found for architecture x86_64
the problem, I originally thought when I saw this, is that it states this error on its own in the Issues output and can lead the user into thinking that the problem is due to the architecture. Actually, all its saying is that there's a defined symbol (often function) whose matching implementation wasn't found.
If you change from Issues to the Compile Output window and scroll up, you'll be able to see exactly what symbols can't be found; mine's displayed in red. It's just annoying that the detail of the missing symbol(s) doesn't show up in the Issues view.
It's easy to replicate this error by just adding a function definition into a header and without implementing the function, call it from the .cpp file. You'll then see something like this in the Issues window
Switching to the Compile Output view and scrolling up displays this: -
So now we see that tthe actual problem is that the function DoSomeStuff in the class called PGGui is being called from the constructor PGGui::PGGui, but the body of DoSomeStuff is missing, as its symbol is not found.
Fortunately I've managed to solve my problem before any answers, so, if anyone is experiencing anything similar, the issue was that it seems you can't split a templated class into a .cpp and a .h file. Putting all declarations of the .cpp
file back into the .h
solved the issue.
I still had a leftover problem, though: duplicated symbols (which was the reason I split it). This time, declaring a variable as external
in the .h
, and redeclaring it without the external
keyword in one (and only one) .cpp
file solved the issue for good.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With