Boktips C / C++

Här pratar vi programmering i dessa olika former. Perl, C/C++, Pascal, ADA, Lisp, COBOL, ZX Basic och mm.
Post Reply
Re-JeeP
Posts: 212
Joined: 24 March 2006, 16:27
Contact:

Boktips C / C++

Post by Re-JeeP » 29 January 2007, 18:12

Hej!

Jag är ute efter en bra bok om C. Det gör inget om boken även tar upp lite C++.

Jag vill helst att den ska inrikta sig på Linux-programmering.
Det jag menar med Linux-programmering är svårdefinierat men tänk er att jag inte vill att författaren säger "Ladda hem programmet ...... För att kompilera koden trycker man på den blå knappen" osv... Utan jag vill lära mig hur man använder tex. gcc för att kompilera från terminalen osv...

Jag kan redan programmera hyfsat i Java och PHP så helst ingen jätte basic bok där if satser och liknande gås igenom.

Jag vill helst ha boken på svenska men det går även bra på engelska.

Någon / några att rekomendera?

Tack på förhand!

Mvh // Johan

User avatar
Jan Pihlgren
Posts: 1447
Joined: 22 April 2002, 02:00
Location: MÄRSTA
Contact:

Post by Jan Pihlgren » 29 January 2007, 18:20

En hyfsad bok om C är:
Programmering i C
av Mitchell Waite, Stephen Prata, Donald Martin
ISBN 91-86200-35-6
Språk: Svenska.
Förlag Pagina
Mitt ex är daterat 1991

User avatar
brain
Posts: 666
Joined: 31 August 2002, 00:03

Post by brain » 29 January 2007, 20:32

THE one and only, som i denna version är översatt till svenska:

Titel: Programmeringsspråket C
Författare: Kernighan, Richie, Tondo, Gimpel
ISBN: 0130282774
I'd rather shuffle a deck of cards in my rectum than read about Microsoft.

n
Posts: 251
Joined: 5 March 2003, 00:57

Post by n » 29 January 2007, 21:07


miixter
Posts: 924
Joined: 29 July 2003, 21:37

Post by miixter » 29 January 2007, 21:07

Key power of Linux - freedom to choose.

Re-JeeP
Posts: 212
Joined: 24 March 2006, 16:27
Contact:

Post by Re-JeeP » 29 January 2007, 21:22

brain wrote:THE one and only, som i denna version är översatt till svenska:

Titel: Programmeringsspråket C
Författare: Kernighan, Richie, Tondo, Gimpel
ISBN: 0130282774
Bara dubbelkollar. Det är denna va?

Den verkar vara helt okej. Dessutom kostade den inte så mycket så det är nog värt en chansning. :)
Jan Pihlgren wrote:Programmering i C
Hmm... menar du Programmering i C#?
Tack, men jag vill hellre ha en bok. Tycker det är enklare än att läsa på en datorskärm.
Bra, tack!

User avatar
kjell-e
Posts: 2817
Joined: 21 December 2002, 16:27
Location: Linköping
Contact:

Post by kjell-e » 30 January 2007, 02:17

Förutom en bok om C eller C++ så rekommenderar jag att du skaffar "Beginning Linux Programming" av Richard Stones och Neil Matthew.

Där hittar du lite mer om utvecklingsmiljö, debugging, curses, inter process communication, POSIX Threads, semaforer, sockets, skalprogrammering, lite om perl och en hel del annat.

Här kommer annars en kort introduktion till gcc.


Kort introduktion till gcc

gcc är en kompilatorsvit som består av en bakända och en frontända.

Bakändan skapar körbar kod för en viss processor och ett visst
operativsystem. Frontändan kompilerar kod för olika programspråk,
t.ex. c och c++. Man har med andra ord skapat ett antal frontändar
för de olika språken och ett antal bakändar för de olika
plattformarna.

Kompilator gcc följer normalt ANSI-standard men det går att få den att
följa gammal c-standard.

När man kör gcc eller g++ så går den igenom alla steg från att
köra preprocessorn, kompilera koden, assemblera koden och länka samman
all kod till ett program. Detta gör den genom att starta olika
delprogram som ingår i gcc-sviten.

Preprocessorn för c, c++ och objective-c heter cpp. Assemblatorn heter
as. Länkaren heter ld.

Viktiga flaggor till gcc
Om inga flaggor ges skrivs resultatet till en programfil som får
namnet a.out. Om man vill att resultatet ska skrivas till en
programfil med ett annat namn får man ge flaggan -o följt av filnamn.
Exempel:

Code: Select all

gcc fil.c -o programfil
För att få binärkoden mer optimerad ska man ge flaggan -O och en
siffra t.ex. -O2. Exempel:

Code: Select all

gcc fil.c -O2 -o programfil
För att bara kompilera till objektfiler, .o-filer, ska man ge flaggan
-c. Exempel:

Code: Select all

gcc -c fil1.c fil2.c
Raden ovan gör att fil1.c kompileras till fil1.o och fil2.c till fil2.o.


Om man vill länka med ett statiskt bibliotek så görs detta med flaggan -l
(lilla L). Exempel för att länka med mattebiblioteket som finns i filen
libm.a:

Code: Select all

gcc program.c -lm -o programfil
Om filen med det statiska biblioteket heter libfoo.a så ska man skala
bort lib och .a och bara ge foo till flaggan -l. D.v.s. -lfoo .

För att länka med dynamiska bibliotek (shared libraries) används också
flaggan -l. T.ex. för att länka mot libfoo.so.1 lägger man till -lfoo . Om det finns både ett statiskt och ett dynamiskt bibliotek så väljer
länkaren det dynamiska biblioteket (shared library).

Det går även att ge sökvägen och filnamn till ett bibliotek till
länkaren. exempel:

Code: Select all

gcc program.c /usr/lib/libm.a -o programfil

Observera att alla källkodsfiler måste ges före länkdirektiven på
kommandoraden. Ett korrekt exempel:

Code: Select all

gcc fil1.c fil2.c fil3.c -lm -lfoo -lbar -o programmet
Ett felaktigt exempel:

Code: Select all

gcc -lm -lfoo -lbar fil1.c fil2.c fil3.c -o programmet
Länkdirektiven skickar gcc vidare till länkaren.


Om man vill att gcc ska söka efter libfiler i en speciell katalog kan
det göras genom att ge flaggan -L sökväg/till/katalog . Exempel:

Code: Select all

gcc fil1.c fil2.c -L libkatalogen  -lfoo -o program


För att få gcc att söka efter include-filer inte bara i katalogen man
står i utan även någon speciell katalog ger man flaggan -I följt av
sökväg till katalogen. Exempel:

Code: Select all

gcc fil1.c fil2.c -I includekatalog -o program

Om man vill att kompilatorn ska ge mer information och fler varningar
kan man lägga till -Wall. Om man dessutom vill att den strikt ska
följa ANSI-standarden och klaga om standarden inte följs kan man ge flaggan
-ansi. För att göra kompilatorn extra pedantiskt och petig lägger man
till -pedantic. Exempel:

Code: Select all

gcc fil1.c fil2.c -Wall -ansi -pedantic -o program
Om kompileringen med -Wall -ansi och -pedantic inte ger några fel
eller varning så är koden syntaktiskt bra.


I programkoden kan man definiera saker med #define. Dessa går även att
definiera på kommandoraden med -D. T.ex. #define DEBUG blir -DDEBUG .
Macron som ges värden kan på kommandoraden skrivas som -Dmacro=värde.




Ett större exempel på kompilering av flera filer och länkning med flera
libfiler till en programfil:

Code: Select all

gcc -Wall -ansi -pedantic fil1.c fil2.c fil3.c -I includekatalog -L libkatalog -lfoo -lbar -o program
Debugging och profilering
För att få med debuginformation för att underlätta debuggande av koden
ska man ge flaggan -g. I och med det kan man använda t.ex. gdb för att
debugga programmet. Exempel:

Code: Select all

gcc -g fil1.c fil2.c -o program
Nu går det att köra gdb på program.

Code: Select all

gdb program
För att även få med profileringsinformation ska man ge flaggan
-pg. Med profilering går det att studera:
* vilka funktioner som anropar vilka andra funktioner.
* hur många gånger som olika funktioner anropas.
* hur mycket körtid som som används i de olika delarna av programmet.

När programmet körs skapas filen gmon.out som innehåller
profileringsinformationen. För att studera profileringsinformationen
kör man därefter gprof på programmet där gprof även läser i gmon.out.
Exempel:

Code: Select all

gcc -pg filen.c -o programmet
./programmet
gprof programmet | less


Nu har du lite av det viktigaste du behöver känna till. Jag kan återkomma med hur man skapar statiska bibliotek och dynamiska/shared libraries och även lite om hur man skapar enkla makefiler och kör make.

User avatar
Jan Pihlgren
Posts: 1447
Joined: 22 April 2002, 02:00
Location: MÄRSTA
Contact:

Post by Jan Pihlgren » 30 January 2007, 05:12

Re-JeeP wrote:
Jan Pihlgren wrote:Programmering i C
Hmm... menar du Programmering i C#?
Nej. Jag menade precis som jag skrev. På den tiden (1991) fanns inte C#.
Last edited by Jan Pihlgren on 30 January 2007, 12:52, edited 1 time in total.

vfr
Posts: 186
Joined: 18 November 2006, 18:05

Post by vfr » 30 January 2007, 12:09

Den citeringen blev väl ändå fel på nåt sätt???

User avatar
brain
Posts: 666
Joined: 31 August 2002, 00:03

Post by brain » 30 January 2007, 17:55

Re-JeeP wrote:
brain wrote:THE one and only, som i denna version är översatt till svenska:

Titel: Programmeringsspråket C
Författare: Kernighan, Richie, Tondo, Gimpel
ISBN: 0130282774
Bara dubbelkollar. Det är denna va?
Japp!
I'd rather shuffle a deck of cards in my rectum than read about Microsoft.

Re-JeeP
Posts: 212
Joined: 24 March 2006, 16:27
Contact:

Post by Re-JeeP » 30 January 2007, 21:16

kjell-e wrote:Förutom en bok om C eller C++ så rekommenderar jag att du skaffar "Beginning Linux Programming" av Richard Stones och Neil Matthew.

Där hittar du lite mer om utvecklingsmiljö, debugging, curses, inter process communication, POSIX Threads, semaforer, sockets, skalprogrammering, lite om perl och en hel del annat..
Den verkar riktigt intressant! Dock 888 sidor... :-?

Det verkar inte som att den finns att köpa i sverige (Säg gärna till om något vet att den finns!).
Jag hittade den på Amazon. Har någon handlat där förut och kan godkänna den?
kjell-e wrote:Här kommer annars en kort introduktion till gcc.
......
......
Tack så mycket! :D
kjell-e wrote:För att få binärkoden mer optimerad ska man ge flaggan -O och en
siffra t.ex. -O2. Exempel:

Code: Select all

gcc fil.c -O2 -o programfil
Det här känner jag igen från Gentoo...
Jan Pihlgren wrote:Nej. Jag menade precis som jag skrev. På den tiden (1991) fanns inte C#.
Okej! Jag hittade den nämnligen inte...
brain wrote:Japp!
Toppen!

User avatar
kjell-e
Posts: 2817
Joined: 21 December 2002, 16:27
Location: Linköping
Contact:

Post by kjell-e » 6 February 2007, 14:34

Jag sa att jag skulle lägga in en text med en introduktion till make också. Här kommer den. Andra som också programmerar och bygger egna makefiler får gärna korrekturläsa.


Kort introduktion till make
Programmet make kan användas till mycket och en vanlig användning är
vid kompilering av program. Programmet make söker i katalogen man står
i efter en fil med namnet Makefile eller makefile. Vanligt brukar vara
att kalla den för Makefile.

En makefil ser ut på följande sätt.

Code: Select all

target: fil1 fil2 fil3
        kommando
Target beror av ett antal filer. Här är det tre stycken, fil1, fil2,
fil3. Om någon av filerna har ändrats så ska kommandot "kommando"
köras. Observera att det är viktigt att det är en <TAB> först på
kommandoraden. Det är tack vare <TAB> som make ser att det är en
kommandorad.

Det make gör för att avgöra om en fil har ändrats är att den tittar på
filens ändringstid. Om en av beroendefilerna har en nyare ändringstid
än filen target då ska det eller de kommandon köras som hör ihop med
detta beroende. Det går alltså att ha flera kommandorader.

När nu denna första makefil är klar kan man stå i samma katalog som
filen ligger i och skriva make. Då tittar make i makefilen och tittar
efter den första targeten och de filer som den är beroende av. Om
någon beroendefil har en nyare tidsstämpel körs kommandona som hör
ihop med denna target. Det går även att skriva make target.

Om nu filerna fil1.c, fil2.c och fil3.c ska kompileras till program
kan makefilen se ut enligt följande.

Code: Select all

program: fil1.c fil2.c fil3.c
<TAB>gcc fil1.c fil2.c fil3.c -o program
Nu går det att köra make eller make program.

Code: Select all

[kjell-e@dumburk labbar]$ make program
gcc fil1.c fil2.c fil3.c -o program
[kjell-e@dumburk labbar]$
Om filen program inte finns har fil1.c, fil2.c och fil3.c nyare
tidsstämplar och då ska kommandoraden köras, d.v.s. programmet
kompileras. Om programmet är kompilerat och någon ändrar i en av
källkodsfilerna och på nytt kör make då kommer make att upptäcka att
en fil har ändrats och så kör den kompileringen.

Om inga filer är ändrade och man kör make kommer make att säga 'make:
"program" är färsk.' eller "make: `program' is up to date." beroende
på språkinställningar.

Nackdelen med att göra som ovan i sin makefil är att oavsett om en,
någon eller många av källkodsfilerna har ändrats så kommmer alla
källkodsfilerna att kompileras om. Om det är många och stora
källkodsfiler så innebär det att det kommer att ta onödigt lång tid.

Man kan då dela upp beroendena i flera delar. Från källkodsfiler till
objektfiler och från objektfiler till färdigt program.

Code: Select all

program: fil1.o fil2.o fil3.o
         gcc fil1.o fil2.o fil3.o -o program

fil1.o: fil1.c
        gcc -c fil1.c
fil2.o: fil2.c
        gcc -c fil2.c
fil3.o: fil3.c
        gcc -c fil3.c
Om programmet nyligen är kompilerat och man ändrar i fil1.c och sedan
kör make då kommer make att upptäcka att fil1.c är nyare än fil1.o och
kompilerar fil1.c till fil1.o. Nu är fil1.o nyare än program så
programmet länkas ihop med den nya fil1.o och de redan existerande
fil2.o och fil3.o, d.v.s. kommandoraden "gcc fil1.o fil2.o fil3.o -o
program" körs. Filerna fil2.c, fil3.c kompileras inte om ifall de inte
har ändrats.


I make finns det inbyggda regler för hur en fil kompileras från
c-källkod till objektkod (och motsvarande för flera andra språk) så
dessa extrarader för fil1.o: fil1.c och tillhörande kommandon (och
motsvarande för fil2 och fil3) behövs inte. Makefile blir därmed kortare.

Code: Select all

program: fil1.o fil2.o fil3.o
         gcc fil1.o fil2.o fil3.o -o program

Man kan även ha variabler i make och dessa skrivs som
VARIABEL = värde1 värde2 värde3 värde4 värde5
För att sedan använda VARIABEL och dess värde skriver man $(VARIABEL) .

Exempel på en Makefile:

Code: Select all

CC = gcc
PROGRAM = program
OBJECTS = fil1.o fil2.o fil3.o
$(PROGRAM): $(OBJECTS)
         $(CC) $(OBJECTS) -o $(PROGRAM)
Notera att här används variabeln CC för namnet på kompilatorn. Om man
byter kompilator så behöver man bara ändra på ett ställe i makefilen och
detta oavsett hur många kommandorader med kompilatorns namn som
förekommer.

Det är även vanligt att lägga flaggorna till kompilatorn i en eller
flera variabler.

Code: Select all

CC = gcc
PROGRAM = program
CFLAGS = -g -O2 -Wall -ansi -pedantic
LFLAGS = -L libkatalog -lm -lfoo -lbar
SOURCE = fil1.c fil2.c fil3.c
$(PROGRAM): $(SOURCE)
         $(CC) $(CFLAGS) $(SOURCE) $(LFLAGS) -o $(PROGRAM)
I make finns det även en form av inbyggda variabler.

$@ ger namnet på target

$^ ger alla beroendefiler

$< ger första beroendefilen


Exempel på en Makefile:

Code: Select all

CC = gcc
PROGRAM = program
OBJECTS = fil1.o fil2.o fil3.o
$(PROGRAM): $(OBJECTS)
         $(CC) $^ -o $@

Som har visats tidigare så kan en target vara beroende av en annan
target (se makefilen med program som var beroende av objektfiler som i
sin tur var targets beroende av c-källkodsfiler).
Exempel på en del av en Makefile:

Code: Select all

CC = gcc
PROGRAM = program
OBJECTS = fil1.o fil2.o fil3.o

install: $(PROGRAM)
         cp  $(PROGRAM)  /usr/local/bin

$(PROGRAM): $(OBJECTS)
         $(CC) $^ -o $@

Det går även att ha tomma targets. Kommandona tillhörande dessa körs
då alltid. Exempel på en del av en Makefile:

Code: Select all

clean:
        \rm -f *~ *.o
Genom att skriva make clean kommer alla filer som ligger i den här
katalogen och som har namn som slutar på ~ respektive slutar på .o att
raderas.

Code: Select all

[kjell-e@dumburk labbar]$ make clean
\rm -f *~ *.o
[kjell-e@dumburk labbar]$

Om man på en kommandorad i en makefil vill ha ett $-tecken så måste
det skrivas som $$. I annat fall kommer make att försöka tolka
$-tecknet.

Om man vill att kommandoraden inte ska skrivas ut innan den körs så
går det att åstadkomma med ett @ i början av kommandoraden.

Code: Select all

CC = gcc
PROGRAM = program
OBJECTS = fil1.o fil2.o fil3.o
$(PROGRAM): $(OBJECTS)
         @ $(CC) $^ -o $@


Om man har flera källkodskataloger och en makefil i varje katalog och
vill köra alla dessa från en huvudkatalog så går det att åstadkomma
genom att låta make köra cd till subkatalogen och där köra make. Allt
detta behöver man göra i ett subskal. Ett subskal fås genom att skriva
kommandona inom parenteser.

Code: Select all

all:
        (cd subkatalog; make)
Om det är många subkataloger är det enklare att använda en loop i
makefilen. Denna loop skapas med for. Exempel:

Code: Select all

SUBKATALOGER = katalog1 katalog2 katalog3 katalog4
all:
        @for SUBKATALOG in $(SUBKATALOGER); do \
             (cd $$SUBKATALOG; make ) || exit 1; \
        done
Variabeln SUBKATALOGER innehåller namnen på katalogerna. For loopar
över dessa och ger SUBKATALOG namnet på en katalog i taget för varje
varv. För var och en av dem körs en cd och make och om make inte gick
bra avslutas allt med en exit 1.


Tidigare nämndes att det finns inbyggda regler i make. Det går att
skapa egna liknande regler. Om man t.ex. vill skapa .f-filer från
.e-filer så använder man % och skriver:

Code: Select all

%.f: %.e
     kommando $< -o $@
En fil som slutar med .f är beroende av en fil med samma namn men som
slutar med .e . Om filen som slutar på .e är nyare ska kommandoraden
köras vilken kompilerar denna enda .e-fil.


För att skapa objektfiler från c-källkodsfiler skulle det då bli.

Code: Select all

%.o: %.c
     gcc -c $< -o $@

Re-JeeP
Posts: 212
Joined: 24 March 2006, 16:27
Contact:

Post by Re-JeeP » 21 March 2007, 20:10

Såg inte att du hade skrivit här men det kommer mycket lägligt att jag ser det nu. Jag har precis kommit igång med C-kodandet.

Tack så mycket! :D

User avatar
kjell-e
Posts: 2817
Joined: 21 December 2002, 16:27
Location: Linköping
Contact:

Post by kjell-e » 2 April 2007, 00:28

Här kommer tredje delen som handlar om biblioteksfiler/libfiler.

De tidigare texterna om gcc och dess flaggor respektive om make lyder under GNU Free Documentation License Version 1.1 eller senare med Copyright Kjell Enblom 2007.


Copyright Kjell enblom, 2007 GNU Free Documentation License Version 1.1 or later.

Kort introduktion till biblioteksfiler (libfiler)
Observera att beskrivningen nedan kan skilja sig något åt mellan olika
Unixdialekter. Beskrivningen nedan ska dock fungera i GNU/Linux.

Biblioteksfiler finns i två former, statiska och dynamiska
(dynamiska kallas även delade/shared).

Statiska bibliotek bakas in i programmet och ligger fast i
programmet. Om det finns ett statiskt bibliotek som heter m och
programmen foo och bar behöver m då ser man till att baka in m i
både foo och bar. Det gör att programfilerna blir större men de
är samtidigt oberoende av biblioteksfilen med biblioteket m i för att
kunna köra.

För att installera och köra foo eller bar på ett system så behövs
bara foo respektive bar. Biblioteket m behövs inte installeras
eftersom de nödvändiga delarna av den finns inbakad i binärerna.

Om m innehåller funktionerna sin och cos och foo är beroende av sin
och bar är beroende av cos så kommer foo att länka med endast sin
och bar att endast länka med cos. Programmen länkar alltså endast med
de funktioner i biblioteket som de behöver.


Statiska biblioteksfiler heter typisk libfoo.a där foo är namnet
på biblioteket.

Dynamiska/delade bibliotek bakas inte in i programmen.
Programfilerna blir därmed mindre än med statiska bibliotek men
de blir beroende av biblioteksfiler. Om programmen foo och bar
behöver biblioteket m så kommer systemet att ladda in programfilen
och biblioteksfilen libm.so.6 in i minnet. Finessen är att biblioteksfilen
endast behövs laddas in en gång. Programmen foo och bar delar på
samma biblioteksfil.

Man ska dock vara medveten om att hela biblioteksfilen
laddas in i minnet så om biblioteksfilen innehåller många funktioner
kommer alla funktioner att laddas in även om det bara är några få som
används.

Biblioteksfilerna laddas in dynamiskt när de behövs och de delas
mellan flera program. Därav dynamiska delade bibliotek (shared libraries).
Dynamiska biblioteksfiler har typiskt namn på formen libfoo.so.x.y
eller libfoo.so.x.y.z där x är version och y eller y.z är release.
Filerna kan även ha namn på formen libfoo-x.y.so.
libzvt.so.2.2.10 är ett exempel på den första formen och
libutil-2.4.so är ett exempel på den senare formen.

Om man vid kompilering av ett program med gcc/g++ vill länka med ett
bibliotek så görs detta med flaggan -l
(lilla L). Det gäller både för statiska och dynamiska bibliotek. Om
ett bibliotek finns både som statiskt och dynamiskt kommer i första
hand det dynamiska att användas.

Exempel för att länka med mattefunktioner som finns i biblioteket m:

Code: Select all

gcc program.c -lm -o programfil
Namnet på ett statiskt bibliotek är det som stå mellan lib och
.a. I exemplet med libfoo.a blir det foo.

Namnet på ett dynamiskt bibliotek är det som står efter lib med .so
och versions- och releasenummer borttaget. Om biblioteksfilen heter
libfoo.so.1.2 eller libfoo-1.2.so så är namnet på biblioteket foo.

Om man vill att länkaren ska söka i en viss katalog så anges detta med
-Lsökväg. T.ex. -L. eller -L/usr/local/foo/lib .


Det går även att ge sökvägen plus filnamn till ett bibliotek till
länkaren. exempel:

Code: Select all

gcc program.c /usr/lib/libm.a -o programfil
Man kan tvinga länkaren att bygga en statiskt länkad binär med -static.

Code: Select all

gcc -Wall -static foo.c -o foo

Skapa statiska bibliotek
Statiska bibliotek har namn på formen libfoo.a .
För att skapa ett statiskt bibliotek gör man enligt följande:

Kompilera källkodsfilerna med flaggorna -g och -c,

Code: Select all

gcc -g -c fil1.c fil2.c fil3.c
Skapa biblioteksfilen med hjälp av programmet ar.

Code: Select all

ar crv libfoo.a fil1.o fil2.o fil3.o
Skapa därefter en innehållsförteckning med ranlib. Detta steg är
nödvändigt i en del system men inte i Linux men det skadar inte att
göra det.

Code: Select all

ranlib libfoo.a
Nu kan man lista vilka objektfiler som ingår i libfoo.a med:

Code: Select all

ar t libfoo.a

Skapa dynamiska/delade bibliotek

Om man har källkodsfilen foo.c och vill skapa biblioteksfilen
libfoo.so.1 så kan det göras på följande sätt:

Kompilera källkoden med:

Code: Select all

gcc -fPIC -Wall -ansi -g -c fil.c
Skapa biblioteksfilen libfoo.so.1.0 som ska innehålla libfoo.so.1 med:

Code: Select all

gcc -g -shared -Wl,--soname,libfoo.so.1 -o libfoo.so.1.0 fil.o -lc

Information om libfilen kan man få fram med objdump. Exempel:

Code: Select all

objdump -p libfoo.so.1.0
Med det kan man se vad SONAME är satt till, vilket i exemplet ovan bör vara
libfoo.so.1 .

Nu är det bara att lägga in biblioteksfilen i en katalog som hittas av
systemet eller lägga det i en katalog, t.ex. /usr/local/mittprogram/lib
och stoppa in sökvägen /usr/local/mittprogram/lib i /etc/ld.so.conf
och därefter köra ldconfig. Programmet ldconfig kommer att sätta upp
symlänken libfoo.so.1 som pekar på libfoo.so.1.0 . Det går även att
köra ldconfig endast för katalogen med biblioteksfilen.
Därefter kan det vara bra att skapa en symlänk libfoo.so som pekar på
libfoo.so.1.

Code: Select all

cp libfoo.so.1.0 /usr/local/mittprogram/lib/
cd /usr/local/mittprogram/lib
/sbin/ldconfig -v -n .
ln -sf libfoo.so.1.0 libfoo.so

Program som länkas mot libfoo.so.1 kommer att kunna använda
libfoo.so.1.0 som innehåller libfoo.so.1. Om man vid ett senare
tillfälle gör mindre uppdateringar i källkoden och kompilerar om den
på samma sätt som ovan men till filen libfoo.so.1.1 så kommer
programmen att kunna använda den nya filen eftersom den innehåller
libfoo.so.1 som är det bibliotek som programmen förväntar sig att hitta.

Principen brukar vara att vid mindre uppdateringar så har man samma
soname, ovan libfoo.so.1, och uppdaterar releasenumret på libfilerna.
Vid större inkompatibla ändringar ger man ett nytt soname med en
uppdaterad versionssiffra vilket med exemplet ovan skulle ge
libfoo.so.2 och filen libfoo.so.2.0 (libfoo.so.2.x).

Genom att göra på det här sättet så kan gamla program fortsätta att
använda libfoo.so.1 (i filerna libfoo.so.1.x) och nya program kan
använda libfoo.so.2 (i filerna libfoo.so.2.x).

Om du tänker använda libtools versionssystem bör du se infosidorna
till libtool, specifikt "Updating version info".

Code: Select all

info libtool "Updating version info"

Vid start av ett program kommer /lib/ld-linux.so.2 att sköta om så
att de dynamiska libfiler som programmet behöver laddas in. Alla
beroenden slås upp och laddas in vilket gör att det kan ta tid att
starta ett program.

För att ta reda på vilka bibliotek ett program behöver för att
kunna köra kan man använda programmet ldd.

ldd programfil

Exempel:

Code: Select all

[kjell-e@dumburk c]$ ldd a.out 
        linux-gate.so.1 =>  (0xb7fbe000)
        libc.so.6 => /lib/libc.so.6 (0x009f0000)
        /lib/ld-linux.so.2 (0x009d3000)


Ett litet exempel på ett enkelt bibliotek och ett litet program som
använder det.

Code: Select all

[kjell-e@dumburk c]$ cat  mitt.c
int mitt(int a) {
    return a * a;
}

[kjell-e@dumburk c]$ cat  mittest.c
#include<stdio.h>


int main() {
  printf("%d\n",mitt(17));
  return 0;
}


[kjell-e@dumburk c]$ gcc -fPIC -Wall -ansi -g -c mitt.c

[kjell-e@dumburk c]$ gcc -g -shared -Wl,--soname,libmitt.so.1 -o libmitt.so.1.0 mitt.o -lc


[kjell-e@dumburk c]$ /sbin/ldconfig -v -n .
.:
        libmitt.so.1 -> libmitt.so.1.0 (changed)

[kjell-e@dumburk c]$ ln -sf libmitt.so.1.0 libmitt.so

[kjell-e@dumburk c]$ gcc mittest.c -L.  -lmitt -o mittest

[kjell-e@dumburk c]$ ./mittest 
289


Därefter är det dags att installera mittest i /usr/local/bin och
libmitt i /usr/local/mitt/lib och se till att systemet hittar biblioteksfilerna.

Code: Select all

[root@dumburk c]# mv mittest /usr/local/bin

[root@dumburk c]# echo "/usr/local/mitt/lib" >> /etc/ld.so.conf

[root@dumburk c]# cp libmitt.so.1.0 /usr/local/mitt/lib/

[root@dumburk c]# ldconfig

[root@dumburk c]# ls -l /usr/local/mitt/lib/
totalt 8
lrwxrwxrwx 1 root root   14  1 apr 00.00 libmitt.so.1 -> libmitt.so.1.0
-rwxr-xr-x 1 root root 5177 31 mar 23.59 libmitt.so.1.0

[root@dumburk c]# ln -sf /usr/local/mitt/lib/libmitt.so.1  /usr/local/mitt/lib/libmitt.so

[root@dumburk c]# ls -l /usr/local/mitt/lib/
totalt 8
lrwxrwxrwx 1 root root   34  1 apr 00.01 libmitt.so -> /usr/local/mitt/lib/libmitt.so.1.0
lrwxrwxrwx 1 root root   14  1 apr 00.00 libmitt.so.1 -> libmitt.so.1.0
-rwxr-xr-x 1 root root 5177 31 mar 23.59 libmitt.so.1.0

[root@dumburk c]# ldd /usr/local/bin/mittest
        linux-gate.so.1 =>  (0x00258000)
        libmitt.so.1 => /usr/local/mitt/lib/libmitt.so.1 (0x002ff000)
        libc.so.6 => /lib/libc.so.6 (0x009f0000)
        /lib/ld-linux.so.2 (0x009d3000)
Om ldd säger "libmitt.so.1 => not found" så beror det på att
biblioteksfilen inte kan hittas. Kontrollera i sådana fall att
katalogen som libmitt ligger i finns med i /etc/ld.so.conf eller i en
av filerna i katalogen /etc/ld.so.conf.d/ . Kör därefter ldconfig.


Man kan vilja ha en headerfil mitt.h

Code: Select all

[kjell-e@dumburk c]$ cat mitt.h 
#ifndef MITT_H
#define MITT_H
int mitt(int);
#endif



Se även "How To Write Shared Libraries" som finns på
http://people.redhat.com/drepper/dsohowto.pdf

Stefan-AB
Posts: 50
Joined: 25 March 2007, 00:25

Bok om programering av C.

Post by Stefan-AB » 2 April 2007, 00:31

Rösta på SD, så kommer stöveltrampen att eka ingen.

ajcc

Post by ajcc » 25 April 2007, 00:30

För nybörjar böcker i C++ kan jag varmt rekommendera Gleerups Programmering A & B böcker. (ISBN13: 9789140635402 för A och ISBN13: 9789140638847 för B) Tyvärr är de svindyra, 423kr på Adlibris och det finns ingen bok för Programmering C kursen.
Tror de kör med Gleerups böckerna på komvux, så de bör finnas i alla fall ett beg. ex. någonstans.

Kerni & Ritchie's bok kanske är lite väl att ta i, som nybörjar bok. Den brukar väl mest användas som referensbok? Mycket bra bok måste jag hålla med om, exemplena i den boken är riktigt vackra, så som programmering bör vara (kollade i den när jag läste programmering a & b).

Såg att O'Reilly har många C++ böcker, kokböcker, praktiska, hur man inte ska göra och massa annat. Men vilken bok är det man vill ha?
Läste programmering a & b i gymnasiet, MVG i båda, sen fick vi världens sämsta lärare i programmering c så vi lärde oss ingenting... för det mesta fick vi byta ut bitmaps eller ändra på liten kodsnutt. Suck.

Så, vad vill jag ha?
Vill repitera grunderna innan jag ger mig på den fina delen av C++, så grunderna och fortsättningen bör ju finnas med i boken.

kobra_swe
Posts: 29
Joined: 11 June 2005, 23:04

köp dessa två böcker

Post by kobra_swe » 4 May 2007, 21:23

vägen till c
och
c++ direkt
båda av jan skansholm. Mycket bra böcker och räcker ganska långt vill jag säga

ajcc

Post by ajcc » 5 May 2007, 02:11

De verkar väldigt bra, de lilla som jag läst på Adlibris.
Kan ju vara värt att inverstera i tror jag :)

kratz
Posts: 1121
Joined: 9 May 2005, 17:21
Location: ~/Högsby
Contact:

Post by kratz » 5 May 2007, 10:13

kjell-e's "introduktioner" är ju bra, varför inte lägga de inläggen i FAQ?
Välkommen till http://archlinux.se !

User avatar
kjell-e
Posts: 2817
Joined: 21 December 2002, 16:27
Location: Linköping
Contact:

Post by kjell-e » 7 May 2007, 10:51

Det kan jag väl ordna någon dag då jag har tid och lust.

User avatar
kjell-e
Posts: 2817
Joined: 21 December 2002, 16:27
Location: Linköping
Contact:

Post by kjell-e » 8 May 2007, 11:33

Nu har jag lagt in texterna i FAQ-devel.
Om folk tycker att de är ok så kan de lyftas in i FAQ.

Post Reply