Jak skompilować i używać bibltioteki jpeglib6

0

Potrzebuję napisać program do zmniejszania obrazków. Musi być napisany w C.
Znalazłem na sieci bibliotekę która obsługuje jpega -dekompresja, kompresja ,resizing itd
ze strony www.jig.org . Napisałem program do zmniejszania obrazków , który używa funkcji zadeklarowanych w nagłówku jpeglib.h . Dodałem nagłówek - wg helpa to powinno wystarczyc do używania funkcji. Włączyłem Compile (W Borland Builderze 6 Personal) a tu wyskoczyły mi błędy linkera:

Unresolved external <nazwa funkcji="funkcji"> in module

dla wszystkich funkcji których używałem i podfunkcji
Próbowałem to obejść tworząc z całego katalogu Jpeg (bibltioeka była w postaci plików .c i .h)
dll , poeksportowałem w pliku nagłówkowym wszystkie używane funkcje _declspec(dlleksport)
i ..... kicha :
to samo Unresolved external

Jak sobie z tym poradzić

0

Ej, Ej, przy kompilacji dll'ki masz tworzoną bibliotekę importową - costam.lib, musisz ją dodać do projektu, w którym chcesz jej używać, linker musi wiedzieć jak importy dla niej poskładać.

0

Unresolved external oznacza że próbujesz używać funkcji mając tylko ich deklarację. Kiedy ściągasz z neta jakąś bibliotekę zazwyczaj masz tam pliki nagłówkowe .h oraz pliki bibliotek .lib i strukturę:

\Include*.h
\Lib*.lib

Pliki .h zawierają deklaracje, a pliki .lib kod funkcji, musisz kazać linkerowi dołączyć te pliki .lib, przykładowo w VC++ 2005 express trzeba wejść w Project<nazwa projektu> properties\Linker\Input\Additional dependencies i dopisać tam wszystkie pliki .lib których chcesz używać, lub w pliku źródłowym tam gdzie dołączasz pliki/plik nagłówkowy z deklaracjami interesujących cię funkcji dopisujesz dyrektywę:

#pragma comment(lib, "nazwa_pliku.lib")

Oczywiście zanim to wszystko zrobisz musisz wskazać katalogi Include i Lib żeby kompilator/linker wiedział gdzie szukać, bądź też wrzucić wszystkie pliki .h i .lib do katalogu z twoim projektem(nie radzę)

A jeśli nie masz plików lib, tylko pliki .h/.c/.cpp to pliki źródłowe .c/.cpp musisz dodać do projektu.

W zależności od tego czy biblioteki(.lib) są dynamiczne czy statyczne to będzie albo tak jak napisał deus, że w plikach .h masz deklaracje, w plikach .dll masz kod, a w pliki .lib posiadają informacje potrzebne do wyciągnięcia kodu z pliku .dll, albo tak jak ja napisałem, czyli pliki .h to deklaracje, a w plikach .lib masz kod.

0

Dzięki wielkie za odpowiedź. Ale właśnie tak potem zrobiłem - dodałem libjpeg.lib którego zbudowałem używając make , (zajmował jakieś 300 kb więc chyba był statyczny) do projektu , uruchamiam i dalej ten sam błąd - Unresolved external.

Potem próbowałem tak jak poradziliście , po prostu dodać wszystkie pliki *.c do projektu i kompilować - ten sam błąd . Nie wiem może jakieś znaczenie ma tu to że biblioteka jest w czystym C a ja używam Buildera C++ ??? Ale powienien być wstecznie kompatybilny skoro można dodać do projektu pliki c ??

0

<nazwa funkcji="funkcji"> ktora sie moze pojawic we bledzie 'unresolved external blah' moze byc albo "_wLandejPostaci" to oznacza ze probuje byc importowana jako symbol z C.
jesli zas jest w stylu "__c_saf_swLadnejPostaci@cc_rUnbgjK" to znaczy - ze jest traktowana jako symbol z C++.

i teraz, skoro uzywasz kompilatora C++ to:

  • Jezeli LIB jest kompatybilny z jezykiem C to powinien udostepniac symbole w ladnej formie i jezeli w Twoim naglowku do tego liba JEST extern"C"{} wokol sygnatur importow - to nazwy importow/exportow powinny sie wygenerowac takie same i to WielkiZdziw(tm) ze masz unresolvedy i najprawdopodobniej chodzi o to ze plik .h oraz plik .lib pochodza z innych wersji biblioteki i po prostu plik .h twierdzi ze funckja X jest, a tej funkcji w tamtym .lib NIE MA.
    symptomy: unresolvedow jest (zwykle) nieduzo i wszystkie nazwy sa 'wLadnejPostaci'
    rozwiazanie: zdobadz .h i .lib pasujace do siebie

  • Jezeli LIB jest kompatybilny z jezykiem C i jezeli w Twoim naglowku do tego liba NIE MA extern"C"{} wokol sygnatur importow - to nazwy importow wygeneruja sie w postaci zmanglowanej (nie-ladnej, tej drugiej) i zadna importowana funckja nie zostanie odnaleziona bo po prostu nazwy sie nie beda zgadzac.
    symptomy: unresolvedow jest (zwykle) bardzo duzo i wszystkie nazwy sa 'wLadnejPostaci'
    rozwiazanie: wyedytuj plik .h od tego liba i otocz wszystkie definicje funkcji klauzula extern "C" {..}, np:

#include <blablabla>

extern "C"{
   int funkcja();
   char* funkcja2(int ble);
}
  • Jezeli LIB jest jest skompilowany jako C++ i eksportuje symbole jako C++ (manglowane), a w Twoim naglowku do tego liba JEST extern"C"{} wokol sygnatur importow - to mamy przypadek jak przed chwila, tylko w druga strone.
    symptomy: unresolvedow jest (zwykle) bardzo duzo i wszystkie nazwy sa manglowane
    rozwiazanie: wywal extern"C"{} z naglowka.

..jezeli LIB jest jest skompilowany jako C++ i eksportuje symbole jako C++ (manglowane), a w Twoim naglowku do tego liba NIE MA extern"C"{} wokol sygnatur importow, ale dalej sa unresolvedy, to pozostaly tylko dwa przypadki:
--- zla wersja .h/.lib, tak jak w przypadku 1', tyle ze teraz C++, patrz przypadek 1'
--- LIB zostal stworzony inna rodzina kompilatorow niz ta ktorej teraz uzywasz.. np. LIB zostal skompilowany pod G++ a uzywasz BCB albo MSVC. problem polega na tym, ze kazda rodzina stosuje inny mangling, tzn. dla tej samego eksportu kompilator A wygeneruje inna nazwe niz kompilator B i zaden symbol nie zostanie odnaleziony
symptomy: unresolvedow jest (zwykle) bardzo duzo i wszystkie nazwy sa manglowane
rozwiazanie: a) zdobyc kompilacje biblioteki na Twoj kompilator albo b) samemu ja sobie skompilowac ze zrodel albo c) poszukac innej..

edit:
co do roznych wersji .h/lib -- to sie tyczy tez wszelkich #define!! lib moglbyc skompilowany z jakims #define ktory wlaczal/wylaczal jakies funkcje/klasy. Twoj program uzywajacy tej biblioteki bedzie musial miec takie same #define ustalone, zeby preprocesor wygenerowal dokladnie taki sam .h jak byl przy kompilacji liba..

1 użytkowników online, w tym zalogowanych: 0, gości: 1