Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"Symbol(s) not found for architecture x86_64" on QtCreator project

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.

like image 448
MaiaVictor Avatar asked Sep 24 '13 04:09

MaiaVictor


2 Answers

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

symbol not found

Switching to the Compile Output view and scrolling up displays this: -

enter image description here

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.

like image 70
TheDarkKnight Avatar answered Sep 21 '22 10:09

TheDarkKnight


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.

like image 32
MaiaVictor Avatar answered Sep 19 '22 10:09

MaiaVictor