Miksi ohjelman linkkaus epäonnistuu, vaikka annan kaikki kirjastot komentorivillä?

Luettele kirjastot linkkauskomennon lopussa, älä alussa.

Mitä väliä on objektitiedostojen ja kirjastojen järjestyksellä? Tarkastellaan sellaisen pienen ohjelman linkkausta, jonka ainoa objektitiedosto on ohjelma.o ja joka käyttää matematiikkakirjastoa.

Oikea komento on gcc ohjelma.o -lm. Linkkeri lukee ensin tiedoston ohjelma.o ja kirjaa muistiin viittaukset tuntemattomiin symboleihin (matematiikkakirjaston funktioihin). Sitten se lukee kirjaston libm.a, joka sisältää monta objektitiedostoa. Niistä otetaan mukaan ne (ja vain ne), jotka määrittelevät tarpeellisia symboleita. Linkkeri tietää nyt, minne ohjelma.o:n viittaukset osoittavat.

Komento gcc -lm ohjelma.o taas käskee linkkerin lukea ensin kirjaston libm.a. Kirjaston mikään osa ei määrittele yhtään tarpeellista symbolia, joten siitä ei oteta mukaan yhtään tiedostoa. Seuraavaksi linkkeri lukee ohjelma.o:n, joka viittaa tuntemattomiin symboleihin. Se kirjaa nämä viittaukset muistiin, mutta koska komentorivillä ei ole enää muuta, viittauksille ei löydy kohdetta.

Edellinen kuvaus ei ole aivan rehellinen, mutta auttaa toivottavasti muistamaan, miksi kirjastot luetellaan lopussa, ja arvaamaan, missä järjestyksessä toisiaan käyttävät kirjastot pitää luetella. Jos haluat ymmärtää paremmin, mitä linkkausvaiheessa tapahtuu, lue gcc:n ja ld:n ohjesivut.