GCC - linux, bibliotekhantering

Elektronikrelaterade (på komponentnivå) frågor och funderingar.
Anonym2
Inlägg: 456
Blev medlem: 17 november 2007, 21:20:16

GCC - linux, bibliotekhantering

Inlägg av Anonym2 »

Hej

Jag håller på att trassla lite med GCC på min Ubuntu dator. Jag försöker få ett program att kunna läsa/skriva från/till serieporten. Jag har hittat en guide för det hela på http://www.captain.at/howto-simple-seri ... xample.php.

Men jag begriper inte hur jag ska använda filerna där riktigt. Där är 2st filer, en som heter capser.h och en capser.c, capser.h har jag förstått ska läggas i /usr/include/ eller i en underkatalog till den i detta fall. Men capser.c? kan den ligga i samma katalog som själva programfilen som komplileras?


//Alexander
Användarvisningsbild
Illuwatar
Inlägg: 2256
Blev medlem: 10 november 2003, 14:44:27
Skype: illuwatar70
Ort: Haninge
Kontakt:

Re: GCC - linux, bibliotekhantering

Inlägg av Illuwatar »

sertar.gz-filen som du kan ladda ner innehåller fyra filer. Packa upp denna utan att ändra strukturen i en temporär katalog. En får en underkatalog med namnet "ser". Gå till nämnda katalog och kör "make" (utan parametrar). Om din miljö är korrekt uppställd skall du se något i denna stil:

linux-ltq0:~/ser # make
gcc -g -c -Wall captain/capser.c -o capser.o
gcc -g -c -Wall ser.c -o ser.o
gcc ser.o capser.o -o ser

När du är klar skall du ha ett litet program som heter "ser". Exempel på körning:

linux-ltq0:~/ser # ./ser
baud=9600
baud=9600
written:ABC
SERIAL EAGAIN ERROR
read failed

(Detta gjordes på en virtuell maskin utan COM-port, därav felmeddelandet).

Jag använde OpenSUSE 11.2, men det borde inte vara skillnad på Ubuntu. Se bara till att vara root, det blir lättare så.
Anonym2
Inlägg: 456
Blev medlem: 17 november 2007, 21:20:16

Re: GCC - linux, bibliotekhantering

Inlägg av Anonym2 »

Tack för hjälpen! nu fungerar det som det ska!



//Alexander
Användarvisningsbild
hcb
Moderator
Inlägg: 6027
Blev medlem: 23 februari 2007, 21:44:50
Skype: hcbecker
Ort: Lystrup / Uppsala
Kontakt:

Re: GCC - linux, bibliotekhantering

Inlägg av hcb »

>Se bara till att vara root, det blir lättare så.

Urk, inte utan att ha kikat i makefilen först, väl?
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Re: GCC - linux, bibliotekhantering

Inlägg av speakman »

Allt blir enklare som root; t.ex. att totalt förstöra hela systemet.

Ha som tumregel: Om du tror att du behöver vara root - tänk igen. Och om du absolut måste vara (som vid "make install") så använd sudo.
Användarvisningsbild
Glenn
Inlägg: 37651
Blev medlem: 24 februari 2006, 12:01:56
Ort: Norr om Sthlm
Kontakt:

Re: GCC - linux, bibliotekhantering

Inlägg av Glenn »

@speakman: Och exakt vad vinner man på att använda sudo i det fallet ??

Sudo har givetvis existensberättigande, men själv använder jag det aldrig, jag har nästan alltid root på alla maskiner
jag använder, och jag har koll på vad jag skriver i rootfönstret och dom vanliga fönstren typ.


..Annars håller jag ju med om principen att man ska försöka göra så lite som möjligt som root.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Re: GCC - linux, bibliotekhantering

Inlägg av speakman »

Poängen med sudo är att man inte "råkar" vara root vid olämpliga tillfällen. Med sudo utför man *en* uppgift som root, sedan är man tillbaka till användaren igen. Ett mönster som är väldigt vettigt att hålla.
Användarvisningsbild
Glenn
Inlägg: 37651
Blev medlem: 24 februari 2006, 12:01:56
Ort: Norr om Sthlm
Kontakt:

Re: GCC - linux, bibliotekhantering

Inlägg av Glenn »

Visst, men joe luser kommer ju att skriva sudo framför varje kommado som inte funkade utan.. visst, man kan ha listor osv, men då kräver det ju att nån annan tänker först.

..Och har man koll kommer man ju ändå bara att sua /byta fönster när det behövs.
Graj
Inlägg: 100
Blev medlem: 28 december 2006, 20:50:03
Ort: Linköping

Re: GCC - linux, bibliotekhantering

Inlägg av Graj »

Eller så skriver du su -c 'kommando'
Då utförs bara ett kommando som root sedan är man åter vanlig användare.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Re: GCC - linux, bibliotekhantering

Inlägg av speakman »

Graj: Och på vilket vis skiljer det från sudo? Det är väl snarare exakt vad sudo gör, fast lite mer flexibelt och enklare?

Glenn: Må hända att man provar med sudo, men det är fortfarande ett smidigt verktyg även för power users. Eller kanske snarast för power users?
Anonym2
Inlägg: 456
Blev medlem: 17 november 2007, 21:20:16

Re: GCC - linux, bibliotekhantering

Inlägg av Anonym2 »

Hej

Nu har jag lite meck med pekare, till en char. programm-snutten ser ut så här:

Kod: Markera allt

	usleep(500000);
	char sResult[254];
	fcntl(fd, F_SETFL, FNDELAY); // don't block serial read

	if (!readport(fd,sResult)) {
		printf("read failed\n");
		close(fd);
		
	}
	printf("readport=%s\n", sResult);
	close(fd);

gl_write(120,140,sResult[0]);
gl_write(120,160,sResult[1]);


}
Jag vill alltså ta ut dom två första tecknen i char vektorn, och skriva till skärmen. Men jag får då felet:

Kod: Markera allt

ser.c: In function ‘main’:
ser.c:88: warning: passing argument 3 of ‘gl_write’ makes pointer from integer without a cast
/usr/include/vgagl.h:156: note: expected ‘char *’ but argument is of type ‘char’
ser.c:89: warning: passing argument 3 of ‘gl_write’ makes pointer from integer without a cast
/usr/include/vgagl.h:156: note: expected ‘char *’ but argument is of type ‘char’
Om jag kör programmet krashar det på segmenteringsfel...

Om jag istället skriver om koden till

Kod: Markera allt

gl_write(120,140,&(sResult[0]));
gl_write(120,140,&(sResult[1]));
så kompilerar den utan knyssel, men presenterar inte den första respektive andra tecknet från sResult, utan samtliga fyra, och den undre dom sista 3.

Jag har inte direkt någon större inblick i pekare och sådant, som ni kanske förstår, förmodligen ett fundamentalt fel...

Någon som vet?

//Alexander
Nerre
Inlägg: 27403
Blev medlem: 19 maj 2008, 07:51:04
Ort: Upplands väsby

Re: GCC - linux, bibliotekhantering

Inlägg av Nerre »

Såvitt jag minns är det så här.

När man skriver ut en sträng i C så ger man funktionen en pekare till början av strängen (normalt bara en pekare till en char, att det är en sträng får man så att säga hålla reda på själv) och den skriver tills den hittar ett NULL. Vill man skriva ett tecken så får man antingen göra en 1-teckens sträng (tecknet följt av NULL) eller använda en funktion som just skriver ut en char.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Re: GCC - linux, bibliotekhantering

Inlägg av speakman »

Precis så är det. Vilket också är anledningen till dina fel.
Användarvisningsbild
arvidb
Inlägg: 4537
Blev medlem: 8 maj 2004, 12:56:24
Ort: Stockholm

Re: GCC - linux, bibliotekhantering

Inlägg av arvidb »

Ditt första försök

Kod: Markera allt

gl_write(120,140,sResult[0]);
gl_write(120,160,sResult[1]);
är syntaktiskt rätt, problemet är bara att gl_write() förväntar sig en sträng (char *) och inte ett tecken (char) som inparameter. Försök hitta någon annan funktion som skriver ut bara en char.

Alternativt kan du göra nåt stil med

Kod: Markera allt

{
   char sResult[254];
   char sTmp[2];
   fcntl(fd, F_SETFL, FNDELAY); // don't block serial read

   if (!readport(fd,sResult)) {
      printf("read failed\n");
      close(fd);
   }
   printf("readport=%s\n", sResult);
   close(fd);

   sTmp[1] = '\0';
   sTmp[0] = sResult[0];
   gl_write(120,140,sTmp);
   sTmp[0] = sResult[1];
   gl_write(120,160,sTmp);
}
Anonym2
Inlägg: 456
Blev medlem: 17 november 2007, 21:20:16

Re: GCC - linux, bibliotekhantering

Inlägg av Anonym2 »

Tackar för hjälpen! nu fungerar det som det ska!


//Alexander
Skriv svar