PI - makefile error

Hoi,

Ik via ebay een Pi AD en DA module gekocht en probeer deze aan de praat te krijgen.
Ik heb de PI via het ethernet gekoppeld aan mijn PC en dan via het programma PuTTy kan ik inloggen op de PI dit is allemaal gelukt.
Uiteindelijk ook gelukt om de USB stick in te lezen en de bestanden gekopieerd naar mijn eigen directory.

Daarna ben ik gaan werken volgens deze site
https://www.waveshare.com/wiki/High-Precision_AD/DA_Board

Ik ben naar de directory ADS1256 gegaan en heb vervolgens het commando make ingetoetst.
Eerst kreeg ik een error omdat het bestand BCM2835.H niet kon vinden ek heb dit bestand in de directory /bin/include geset waar ook de overige C bibliotheken staan.

Daarna weer make geprobeerd met het volgende resultaat

code:

pi@raspberrypi:~/leendert/ADS1256 $ make
cc    -c -o ads1256_test.o ads1256_test.c
ads1256_test.c:899:2: warning: null character(s) ignored
 }
  ^
gcc ads1256_test.c -o ads1256_test -lbcm2835
ads1256_test.c:899:2: warning: null character(s) ignored
 }
  ^
/usr/bin/ld: cannot find -lbcm2835
collect2: error: ld returned 1 exit status
Makefile:2: recept voor doel 'ads1256_test' is mislukt
make: *** [ads1256_test] Fout 1

Moet ik ergens nog een keer BMC2835.h neer zetten of is het nu op zoek naar bmc2835.c. Die laatste heb ik ook in /usr/include geplaatst maar hetzelfde resultaat

Heb je de stap bij getting started al gedaan?
Hierin word aangegeven dat je de lib nodig hebt en waar deze te downloaden is.

Die warning is ook "raar". Volgens mij is het een hint dat je source code corrupt is.
Waar

code:


  int main (int argc, char **argv);

had moeten staan, daar kan nu iets van:

code:


  int main (int a\0gc, char **argv);

staan. Hierbij is de \0 dus een ascii NULL (niet te verwarren met '0' == 0x30 = 48).

Hier in mijn voorbeeld zou eea met "ignoring null" nog wel goed kunnen gaan als je programma die "argc" bijvoorbeeld verder niet gebruikt. Gezien hoe GOED jou programma nog compileert is dat een hint dat mogelijk een spatie of een tab te grazen genomen is door de corruptie. Maar dit moet je zien als een hint dat je hardware (SD kaart) onbetrouwbaar is.

Daar waar mogelijk: Controleer de MD5sums. Hier: download nog een keer en kijk of de files identiek zijn. (md5sum, cmp, diff).

Update: klunzen bij waveshare: De horen-er-niet-in null karakters staan in het bestand, en aan het eind, waar het gelukkig geen kwaad kan.

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

Voor het linken kom je de file: libbcm2835.so tekort.
Die zul je nog ergens vandaan moeten halen en in je directory moeten zetten waar je de sources hebt staan of in: /usr/lib/ of zo.
Hangt een beetje af van de linux distributie waar exact.

De sourcecode is inderdaad corrupt, waarschijnlijk staan er meer van die nul-chars in?
Nu maar hopen dat de lib niet corrupt is bij het downloaden, want dat kun je niet effe fixen met een editor.

[Bericht gewijzigd door henri62 op 14 november 2018 12:42:45 (14%)]

Henri's Law 1: De wet van behoud van ellende. Law 2: Ellende komt nooit alleen.

Heb je de stap bij getting started al gedaan?

Ja dat heb ik gedaan.

Maar dit moet je zien als een hint dat je hardware (SD kaart) onbetrouwbaar is.

Ik neem aan dat de make opdracht naar dezelfde directory schrijft als waar je deze aanroept ?

Linux is nog erg nieuw voor mij.

Nu maar hopen dat de lib niet corrupt is bij het downloaden,

Dan ga ik eerst even opnieuw downloaden.

Voor het linken kom je de file: libbcm2835.so tekort.

Ik begrijp even niet waaraan je ziet dat het lib*.so moet zijn. dus ik bedoel waarom er nog lib voor bcm2835.so moet staan. Er staan in mijn downloads überhaupt geen .so bestanden dus daar ga ik ook nog even naar opzoek.

Maar gaat wel lekker zo:). De Tutorial ziet er goed verzorgt uit maar de software zelf is wat minder.

Update
De fout lag toch aan mijn kant. Ik had de BCM2835 zip file wel gedownload maar wist niet wat ik er precies mee moest doen gelukkig een website met uitleg gevonden en nu werkt alles wel. HEt werkt echter alleen als super user via SUDO maar daar ga ik me nog verder in verdiepen.

[Bericht gewijzigd door benleentje op 14 november 2018 21:22:44 (15%)]

Op 14 november 2018 18:25:44 schreef benleentje:
[...]
Dan ga ik eerst even opnieuw downloaden.
[...]Ik begrijp even niet waaraan je ziet dat het lib*.so moet zijn. dus ik bedoel waarom er nog lib voor bcm2835.so moet staan. Er staan in mijn downloads überhaupt geen .so bestanden dus daar ga ik ook nog even naar opzoek.

Don't shoot the messenger! Dat doet de Gcc compiler / Linker nu eenmaal zo.
Als je bijvoorbeeld de Clib nodig hebt word de optie -lc meegegeven, in werkelijkheid zoekt de linker dan dus naar libc.so (of een versie specifieke libc.so.6 oid).

Wat wel raar is dat je: /usr/bin/ld: cannot find -lbcm2835 ziet.
Dat wil waarschijnlijk zeggen dat er C compiler opties (want dat is die -l) aan de linker meegegeven zijn ipv aan de c compiler die ook ergens een corruptie in de makefile.

Oh ja: Let erop dat in de makefile er TABS gebruikt worden ipv spaties voor de indents van de rules. Help je die met een editor om zeep krijg je de raarste errors.

Henri's Law 1: De wet van behoud van ellende. Law 2: Ellende komt nooit alleen.

ok nu begrijp ik weer iets meer.

Het is ondertussen al gelukt mede dankzij jouw nu ik wist waarop ik verder moest gaan zoeken.
ik moest eerst de lib bcm2835 nog via make converteren en daarna installeren.

Er is een conventie: Libraries heten lib<librarynaam>.<extensie>

Die extensie kan "so" zijn voor "shared object". Het OS hoeft zo'n library maar 1x in het geheugen te hebben als er meerdere programmas gebruik van maken. het alternatief is "a" voor "archive". Dat is gewoon een verzameling voor-gecompileerde programmastukjes die je kan gebruiken. De linker pakt degenen die je gebruikt er uit en plakt ze op de juiste manier in je programma. Omdat ieder stukje nu voldoende anders is dan de andere copieen zal een veelgebruikte library nu effectief vele malen in het geheugen staan. Vandaar dat men liever die eerste variant gebruikt.

Daarnaast is er een conventie: als je de library genaamd piet wil linken, dan geef je aan de library op: "-lpiet" De compiler weet dan dat ie naar een bestand "libpiet" op zoek moet met ofwel .a ofwel .so er achter.

Normaliter staan die dingen in /usr/lib/ . Zoeken op een deel van de filenaam is:
find /usr/lib -name \*bcm\*
dan zou ie (als ie geinstalleerd is) met de libbcm2835.so op de proppen moeten komen.

Een library als de bcm2835 zal, denk ik, tegenwoordig wel in de distributie zitten. Dus in plaats van dat je gaat klooien met de hand om te zorgen dat het ding op de juiste manier geinstalleerd wordt, zou ik zeggen:

apt-cache search bcm2835

Als het goed is, komt ie dan (onder andere) met een pakket wat "libbcm2835" heet. Dan doe je

sudo apt install <denaamvandatpakket>

(helaas hier te weinig conventies: Als de library libbcm2835.so heet, dan kan het pakket gpio, bcm2835 of libbcm2835 heten of nog wat anders. Dus even opzoeken met apt-cache).

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

@rew bedankt voor wat extra informatie

Een library als de bcm2835 zal, denk ik, tegenwoordig wel in de distributie zitten.

Daar ben ik nu een paar dagen later ook achter. Er zit al support ingebouwd voor de pi en ik begrijp dus eigenlijk ook niet waarom ze dat niet gewone gebruiken.

De makers van het stukje hardware met bij behorende software hebben blijkbaar niet echt hun best gedaan om een goed stukje software te bouwen. Want het is eigenlijk ook niet echt bruikbaar omdat je het enkel als root kan uitvoeren en niet als normale gebruiker.

Langzaam aan kom ik steeds een stukje verder gelukkig is er erg veel op het www te vinden. Dus met het bestaande software zal ik over een paar maanden wel iets vergelijkbaars in phyton kunnen maken wat gewoon gebruikt maakt van de standaard lib files.

apt-cache search

goede en bruikbare tip.