Hela,
Ik liep gisteravond tegen een probleem aan toen ik m'n code even wilde gaan opschonen en in twee aparte bestanden splitste. Nu weet ik daar tijdelijk omheen te werken (zie verder) maar bepaald fijn is het niet. Hopelijk weet iemand waar het probleem ligt want ik heb de afgelopen twee uur google afgespeurd en hopeloos weinig weten te vinden. Ik zit op m'n werk dus ik kan helaas niet de exacte meldingen geven die ld uitspuugt. Indien dit gewenst is zal het even tot vanavond moeten wachten.
Stel, ik heb drie bestanden;
Als dit allen in een Xcode project staan gaat xcode dit vrolijk voor je compilen, maar doet dat per bestand. Hierdoor (dit is mijn interpretatie van het probleem iig) werkt de header guard niet meer, en wordt de variabele blah twee keer gedefinieerd. Namelijk, in main.o en foo.o. Wanneer ld dit dan vervolgens probeert te linken krijg ik een error iets in de trand van:
multiple definitions of blah, in main.o (data) & foo.o (data)
Door de #include lijn in main weg te halen wordt deze error opgelost, maar krijg je dus wel een waarschuwing. Namelijk:
implicit declaration of bar() in main.c
Nou ben ik daar dus ook niet heel erg blij mee, en hoop dat iemand weet wat dit veroorzaakt (is het wat ik denk dat het is) en hoe ik dit op kan lossen / omheen kan werken zonder waarschuwingen.
Wat google wel meldde leek erop dat het misschien met fink te maken had (dit is geinstalleerd en staat in de PATH), en voor de volledigheid; ik heb de openGL, GLUT en cocoa (nodig voor GLUT) frameworks in m'n project zitten. Ga er ook even vanuit dat blah niet weggeoptimaliseerd wordt in dit voorbeeld.
Iemand dit eerder gezien?
Ik liep gisteravond tegen een probleem aan toen ik m'n code even wilde gaan opschonen en in twee aparte bestanden splitste. Nu weet ik daar tijdelijk omheen te werken (zie verder) maar bepaald fijn is het niet. Hopelijk weet iemand waar het probleem ligt want ik heb de afgelopen twee uur google afgespeurd en hopeloos weinig weten te vinden. Ik zit op m'n werk dus ik kan helaas niet de exacte meldingen geven die ld uitspuugt. Indien dit gewenst is zal het even tot vanavond moeten wachten.
Stel, ik heb drie bestanden;
C:
1
2
3
4
5
6
7
| //main.c #include "foo.h" void main() { bar(); } |
C:
1
2
3
4
5
6
7
8
9
10
11
| //foo.h #ifndef FOO #define FOO #include "stdio.h" int blah = 123; void bar(); #endif /* FOO */ |
C:
1
2
3
4
5
6
7
| //foo.c #include "foo.h" // Dank aan koli-man, ff vergeten in dit voorbeeld :P void bar() { printf("%d\n", blah); } |
Als dit allen in een Xcode project staan gaat xcode dit vrolijk voor je compilen, maar doet dat per bestand. Hierdoor (dit is mijn interpretatie van het probleem iig) werkt de header guard niet meer, en wordt de variabele blah twee keer gedefinieerd. Namelijk, in main.o en foo.o. Wanneer ld dit dan vervolgens probeert te linken krijg ik een error iets in de trand van:
multiple definitions of blah, in main.o (data) & foo.o (data)
Door de #include lijn in main weg te halen wordt deze error opgelost, maar krijg je dus wel een waarschuwing. Namelijk:
implicit declaration of bar() in main.c
Nou ben ik daar dus ook niet heel erg blij mee, en hoop dat iemand weet wat dit veroorzaakt (is het wat ik denk dat het is) en hoe ik dit op kan lossen / omheen kan werken zonder waarschuwingen.
Wat google wel meldde leek erop dat het misschien met fink te maken had (dit is geinstalleerd en staat in de PATH), en voor de volledigheid; ik heb de openGL, GLUT en cocoa (nodig voor GLUT) frameworks in m'n project zitten. Ga er ook even vanuit dat blah niet weggeoptimaliseerd wordt in dit voorbeeld.
Iemand dit eerder gezien?
[ Voor 9% gewijzigd door wacco op 22-09-2005 16:10 ]