Issue #1 - "LNK2001: Unresolved External XXX()" za Win32 API funkcije"
Ovo je jako cest pocetnicki problem kod pisanja Win32 aplikacija koje koriste advanced Win32 API. Naime, sve Win32 API funkcije su implementirane u Win32 DLL fajlovima (dobro.. neke se mapiraju na native kernel - tj. win32k.sys, ali to nije tema za FAQ ;), ciji su exporti definisani u tzv. "import" bibliotekama. Import biblioteke sadrze tacne podatke u kom DLL fajlu su implementirane funkcije.
Postoji i drugaciji nacin pozivanja Win32 funkcije iz dinamicke biblioteke - kroz tzv. "dinamicko" ucitavanje - ali ovo nije bas prakticno za sve upotrebe, i komplikovanije je. Za vecinu primena je staticko linkovanje sa import bibliotekama najbolje resenje jer ucitavanje DLL fajla u memoriju i mapiranje adresa radi Win32 kernel a ne programer.
Default setovanja VC++ linkera ukljucuju CRT biblioteku i kernel32.lib (elementarne Win32 kernel funkcije) - ostale Win32 funkcije ce zahtevati dodavanje odgovarajucih biblioteka.
Dakle, vi kompajlirate program - i dobijete nesto tipa:
Code:
moj_object.obj : error LNK2001: unresolved external symbol _CreateToolbarEx()
Sta sad? U kojoj import biblioteci se nalazi CreateToolbarEx() funkcija?
Evo prostog nacina za nalazenje funkcija:
Step #1: U MSDN-u je potrebno naci opis te funkcije, kroz search. Kada pronadjete opis funkciju, na dnu opisa ce pisati nesto nalik na:
Citat:
Requirements
Windows NT/2000: Requires Windows NT 3.51 or later
Windows 95/98: Requires Windows 95 or later
Header: Declared in commctrl.h.
Import Library: comctl32.lib.
Nama je od vaznosti poslednja stavka (
Import Library) - to je biblioteka u kojoj se nalazi opis linka na tu Win32 funkciju.
Step #2: Ako koristite VisualStudio Project, u Project Settings dijalogu (Project / Settings... ili Alt+F7 u default VC6 konfiguraciji) dodajte vasu biblioteku:
Step #3: Iskompajlirajte vas projekat - unresolved external je proslost.
Poenta cele price je znati koristiti MSDN dokumentaciju, u kojoj je sve jasno i koncizno napisano.
U komandnoj liniji je potrebno library navesti kao parametar linkeru:
Code:
cl.exe mojfajl.c -link comctl32.lib