undefined reference to 'cos' / 'sin'

Hoi,

Ik blijf maar vreemde meldingen krijgen wat betreft een cosinus en sinus functie in CooCox bij het compileren. Iemand een idee wat de compiler hier niet leuk vindt? Math.h library zit er in en alle variabeles zijn type int. (behalve M_PI neem ik aan) Dezelfde code werkt vlekkenloos is programma's als DEVc++ en Codeblocks.

Een losse functie zoals cos(45) compileert ie zonder problemen, maar wanneer ik de huidige formule wil compileren gooit ie hem er uit en geeft ie de volgende melding

Hier de code met formule

elmowww

Golden Member

Waarschijnlijk kan ie toch de library niet vinden.

Kan je met ctrl+click de file vijven waar ie in zit? (math.h)?

Zit dit oaf naar dit bestand in je compiler omgeving?

PA0EJE - www.eje-electronics.nl - e.jongerius[aapje]eje-electronics.nl - EJE Electronics - Elektronica/firmware ontwikkeling

math.h is niet de library. Dat is alleen de header file. En die heb je inderdaad mee want de compiler geeft geen foutmeldingen.

Het is hier de linker die de funkties niet kan vinden. Dus de libraries zijn niet mee.

Maar bestaat CooCox nog? Volgens mij zijn die alweer een aantal jaar uit de lucht. Vaar STM kun je beter over naar Atollic, maar dat is wel weer even flink omschakelen.

elmowww

Golden Member

Dan moet de math lib meegegeven worden aan de linker denk ik.

Linker optie -lm. Kan je waarschijnlijk voor elkaar krijgen die include library m in je tool chain config mee te nemen.

Heb jij toevallig de installer van coocox voor windows nog? Ooit voor een project gebruikt, maar heb de installer niet meer...

[Bericht gewijzigd door elmowww op donderdag 16 januari 2020 23:25:20 (67%)

PA0EJE - www.eje-electronics.nl - e.jongerius[aapje]eje-electronics.nl - EJE Electronics - Elektronica/firmware ontwikkeling

CoIDE-1.7.8.exe heb ik hier nog staan.

Dikke 460 Mb.

elmowww

Golden Member

Dat is de installer?

Kan je mij die sturen? (zie mailadres in profiel of hieronder) via wetransfer wellicht? Thx alvast!

PA0EJE - www.eje-electronics.nl - e.jongerius[aapje]eje-electronics.nl - EJE Electronics - Elektronica/firmware ontwikkeling

Op 16 januari 2020 23:21:58 schreef elmowww:
Dan moet de math lib meegegeven worden aan de linker denk ik.

Linker optie -lm. Kan je waarschijnlijk voor elkaar krijgen die include library m in je tool chain config mee te nemen.

Heb jij toevallig de installer van coocox voor windows nog? Ooit voor een project gebruikt, maar heb de installer niet meer...

Dit las ik dus op het internet ook, maar begrijp niet echt wat er wordt bedoeld met meegeven aan de linker? Wat is de linker?

Op 16 januari 2020 23:31:50 schreef deKees:
CoIDE-1.7.8.exe heb ik hier nog staan.

Dikke 460 Mb.

Ik heb hem evt ook nog wel ergens vermoed ik.

elmowww

Golden Member

De linker voegt alle los gecompileerde stukjes code samen op de juiste plaats.

In jou geval bestaat de math lib uit een .h bestand waarin alle functies en het gebruik ervan beschreven staan, (dat zijn een soort linkjes). De daadwerkelijke implementatie is sterk geoptimaliseerd en wordt niet steeds opnieuw gecompileerd, maar wordt als een bestaande reeds gecompileerde library gebruikt.
De linker heeft als taak om de stukjes gecompileerde code die bij de referenties horen in te voegen.

In jou geval kan hij de header vinden, daardoor gaat het daadwerkelijke compileren wel goed, maar de gecompileerde code van math.h kan hij niet vinden.

Je kunt bij je project settings heel veel aangeven. Ik weet niet precies uit mijn hoofd hoe dat zit bij coocox, maar je kunt volgens mij bij de linker settings aangeven dat hij een extra library moet meenemen. Als je daar enkel aangeeft dat hij de m meeneemt het goed moeten gaan.

Meestal zie je ook het resulterende gcc commando ergens staan, dat moet de optie -lm bij komen. (-l betekend include libray, m staat voor math)

PA0EJE - www.eje-electronics.nl - e.jongerius[aapje]eje-electronics.nl - EJE Electronics - Elektronica/firmware ontwikkeling

Op 16 januari 2020 23:55:13 schreef elmowww:
De linker voegt alle los gecompileerde stukjes code samen op de juiste plaats.

In jou geval bestaat de math lib uit een .h bestand waarin alle functies en het gebruik ervan beschreven staan, (dat zijn een soort linkjes). De daadwerkelijke implementatie is sterk geoptimaliseerd en wordt niet ......

Ah, juistem. Duidelijk verhaal.

Het schijnt dus dat ik hier (zie foto) die -lm in moet voeren. Geprobeerd, maar werkt helaas nog niet. Opgeslagen, afgesloten, opgestart enz enz, maar tevergeefs

Wellicht heeft het er iets mee te maken dat de cos functie een Double is? Zodra ik de j en i toevoeg in de formule geeft ie deze melding. Wanneer ik alleen cos(-(2 * M_PI) gebruikt vind ie alles goed. Vreemd, aangezien j & i simpele ints zijn. Ook wanneer ik hiervan een double maak gaat de compiler nog niet akkoord.

Kan goed zijn. cos(int) en cos(double) zijn verschillende funkties voor een C++ compiler. cos(int) bestaat niet dus dan loopt de linker vast.

Maar als je alles als 'C' compileert dan zou dat geen probleem moeten geven.

Je sourcefiles hebben de extensie .c dus dan werk je waarschijnlijk niet in C++, tenzij je dat toch ergens in de compiler opties hebt aangezet.

Je hebt die -lm bij de compiler opties gezet, maar het gaat om de linker, en dat is niet hetzelfde. Probeer het eens een tabblad verder.

Ik ken Coocox nauwelijks, en ik zou je ook aanraden over de stappen op Atollic, maar dan de laatste versie van Truestudio, want de nieuwe CubeMX van ST is echt verschrikkelijk.

Een manager is iemand die denkt dat negen vrouwen in één maand een kind kunnen maken

Op 17 januari 2020 01:12:18 schreef SparkyGSX:
Je hebt die -lm bij de compiler opties gezet, maar het gaat om de linker, en dat is niet hetzelfde. Probeer het eens een tabblad verder.

Ik ken Coocox nauwelijks, en ik zou je ook aanraden over de stappen op Atollic, maar dan de laatste versie van Truestudio, want de nieuwe CubeMX van ST is echt verschrikkelijk.

Klopt als een bus. Werkt nu. Bedankt iedereen!
Mag een slotje op.

Voor diegene die ooit tegen hetzelfde probleem aanlopen en ook de CoIDE gebruiken:

elmowww

Golden Member

Mooi dat je laat wetetn dat het werkt!

En bedankt heren voor de isnteller.

PA0EJE - www.eje-electronics.nl - e.jongerius[aapje]eje-electronics.nl - EJE Electronics - Elektronica/firmware ontwikkeling

Blijft toch vreemd dat het soms wel werkt, als in

Wanneer ik alleen cos(-(2 * M_PI) gebruikt vind ie alles goed.

Nee. De expressie "cos(-(2 * M_PI)" is een floating point constante (ook wel "1.0" genoemd), die niet uitgerekend hoeft te worden in je programma. De compiler rekent het voor je uit en bouwt het programma alsof er de constante (double)1.0 stond. Of ie zo slim is dat ie
cos(-(2000 * M_PI) ook nog als 1.0 ziet of dat er dan afrondingsfouten op gaan treden dat weet ik niet. (uit m'n hoofd denk ik dat ie tot op de precisie van een double echt op 1.0 uit komt bij 2*PI, maar bij een paar duizend keer pi gaat het een keer mis met een paar lage orde bitjes....).

Edit: getest: Tussen de 45 miljoen keer pi en de 50 miljoen keer pi gaat het voor het eerst niet precies.
Edit2: op 12 decimalen achter de comma (%.12f) print ie dan nog steeds 1.00... pas bij 16 decimalen zie je dat het niet meer exact is.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/

Ja, Ok dat verklaart de zaak.
Toch wel een slim ding zo een compiler.

En: in ontwikkeling: 20-30 jaar geleden was dit nog niet.

Je moet je namelijk realiseren dat jij en ik weten dat cos(2pi) altijd 1.0 is en niet afhangt van globale variabelen of andersom een globale variabele kan beinvloeden.

four NANDS do make a NOR . Kijk ook eens in onze shop: http://www.bitwizard.nl/shop/