In een al bestaand en wat groter project ben ik bezig om de O1 compiler optimalisatie van gcc aan te zetten.
Zonder deze O1 compiler optimalisatie bouwt, linkt en runt alles keurig netjes.
Als ik compileer met de O1 flag dan bouwt de main exacutable gewoon, maar krijg ik linker error's bij een van de unittesten.
tussen deze 2 compile slagen is geen code of makefiles aangepast, maar alleen de O1 optimalisatie aangezet.
de error die ik krijg is:
ergens bij het linken komt ie in de Builder.cpp op regel 123 deze call tegen:
cpp file
(naast de linker error over de Instance, heb ik zo'n zelfde over de CreateObject functie)
Als ik dan kijk naar de Factory
header file
en in de cpp file
Als eerste heb ik een gehele clean en rebuild gedaan, maar dat bood geen soelaas.
Ook heb ik met behulp van nm dumps gemaakt van de symbols van Factory.o (eentje met en eentje zonder optimalisatie) en deze vergeleken.
Ik zie dat er wat symbols verdwenen zijn, maar niet die van Factory::Instance(). wel zie ik dat er iets met de adressen is veranderd omtrend deze functie, maar dat lijkt me geen probleem.
Ook via google heb ik allerlei opties gevonden, maar niet wat mijn probleem lijkt te zijn.
Heeft iemand een idee in welke hoek dat ik het kan zoeken?
Zonder deze O1 compiler optimalisatie bouwt, linkt en runt alles keurig netjes.
Als ik compileer met de O1 flag dan bouwt de main exacutable gewoon, maar krijg ik linker error's bij een van de unittesten.
tussen deze 2 compile slagen is geen code of makefiles aangepast, maar alleen de O1 optimalisatie aangezet.
de error die ik krijg is:
code:
1
2
| Configuration.a(Builder.o): In function `Builder::Create() const': Builder.cpp:123: undefined reference to `Factory::Instance()' |
ergens bij het linken komt ie in de Builder.cpp op regel 123 deze call tegen:
cpp file
code:
1
| pObject = Factory::Instance()->CreateObject(); |
(naast de linker error over de Instance, heb ik zo'n zelfde over de CreateObject functie)
Als ik dan kijk naar de Factory
header file
code:
1
2
3
4
5
| class Factory
{
public:
static Factory* Instance();
<< rest of the file >> |
en in de cpp file
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| Factory* Factory::sInstance = 0;
Factory* Factory::Instance()
{
// Check if this is the first call
if (sInstance == 0)
{
// Create only instance
sInstance = new Factory();
}
// Address of the instance
return sInstance;
} |
Als eerste heb ik een gehele clean en rebuild gedaan, maar dat bood geen soelaas.
Ook heb ik met behulp van nm dumps gemaakt van de symbols van Factory.o (eentje met en eentje zonder optimalisatie) en deze vergeleken.
Ik zie dat er wat symbols verdwenen zijn, maar niet die van Factory::Instance(). wel zie ik dat er iets met de adressen is veranderd omtrend deze functie, maar dat lijkt me geen probleem.
Ook via google heb ik allerlei opties gevonden, maar niet wat mijn probleem lijkt te zijn.
Heeft iemand een idee in welke hoek dat ik het kan zoeken?
[ Voor 4% gewijzigd door liquid_ice op 20-03-2013 17:40 ]
Klus page: http://klusthuis.blogspot.com