[C++] Kompilacja biblioteki złożonej z wielu plików

0

Witam,
Miałem sobie napisać konsolowy program/kalkulator, który by wykonywał proste (wkrótce może i bardziej złożone) operacje wyłącznie na liczbach w systemie dwójkowym i szesnastkowym. Założenie było takie, aby liczby były podawane jako parametry wywołania programu, ale szybko okazało się że trzeba np liczbę 011101101 jakoś odebrać i przeliczyć jej wartość. Dlatego zacząłem pisać sobie taką małą, własną i podręczną biblioteczkę zawierającą różne takie śmieszne funkcje jak właśnie odebranie liczby binarnej jako obiekt klasy string i obliczenie jego wartość w systemie dziesiętnym. Biblioteka jak na razie składa się z pliku nagłówkowego libdoles.hpp zawierającego przestrzeń nazw "doles" oraz deklarację funkcji i klasy error którą będę rzucał jako wyjątek w razie niepowodzenia. Jest także plik libdoles.cpp zawierający definicję funkcji oraz libdoles_error.cpp zawierający definicję klasy error. Przykładowo dodałem jeszcze program o kodzie źródłowym "kodzik.cpp" tak tylko aby sobie sprawdzać czy ta biblioteka działa dobrze. Ale mój problem polega na czymś innym. Mianowicie napisałem Makefile i gdy chcę skompilować wspomniany wyżej program pomocniczy musiałem go kompilować opcją:

g++ wszystko co ma rozszerznie *.o -o program

I zastanawiam się jak zrobić abym mógł kompilować dowolny inny program używając mojej biblioteki używając zwykłego polecenia g++ nazwa_kodu.cpp -o program_wyjściowy. Po prostu ma to wyglądaj jak przy użyciu #include <iostream> czy jakiś inny plik nagłówkowy tak abym nie musiał kompilować mojego programu ze wszystkimi modułami biblioteki. Co trzeba w takim razie zrobić ? Plik libdoles.hpp przekopiować do /usr/include ? Ale co zrobić z plikami o skompilowanym kodzie z rozszerzniem .o ? Byłbym wdzięczny za pomoc w rozwiązaniu tego problemu.
PS: Nie chciałem wklejać tutaj kodów żródłowych bo zajęłoby to bardzo dużo miejsca więc postanowiłem spakować katalog gdzie są wszystkie pliki
i dołączę linka ( to tylko 10 kB):
http://rapidshare.com/files/48676013/biblioteczka.tar.gz.html

0

Musisz skompilowac do biblioteki (np libfotel.a), nastepnie do include wrzucasz headery, do lib ta wlasnie biblioteke a program kompilujesz np

g++ -lfotel program.cpp

Nie pamietam jak sie linkuje do .a, ale w manie na pewno znajdziesz.

0

Polecenie 'g++ zrodlo.c biblioteka.o' na początku skompiluje zrodlo.c, a potem sprobuje zlinkowac oba *.o. Cala filozofia.

0

Dzięki za pomoc, spróbóję pokombinować zarówno w jeden jak i w drugi sposób. Sprawdzę jeszcze jakby to było gdybym w Anjucie wziął nowy projekt i wybrał opcję stwórz bibliotekę statyczną. Może byłoby nawet wygodniej :) Dzięki za pomoc (myślałem, że rozwiązanie będzie bardziej zawiłe :))

---EDIT (08.16)---
Niestety ani jednym ani drugim sposobem nie udało mi się rozwiązać mojego problemu. Wolverine przeszukałem manuala od gcc i g++ i nie było nic o tworzeniu pliku *.a. Były wzmianki tylko o linkowaniu pliku z gotowymi już bibliotekami o rozszerzniu .a. Wziąłem nowy projekt w Anjuta, następnie kategoria biblioteka statyczna bla bla i potem dodałem te moje pliczki źródłowe/nagłówkowe do katalogu z projektem. Kod się skompilował do .a. Po "budowaniu dystrybucji" jak to się w tym IDE nazywa po prostu skopiowałem te plik tak jak mówiłeś. Przeniosło nagłówki i kod skompilowany do /usr/include i /usr/lib. Zmodyfikowałem plik kodzik.cpp mianowicie linijkę

#include "libdoles.hpp"

zamieniłem na

#include <libdoles.hpp>

Następnie chciałem skompilować ten plik kodzik.cpp i dałem polecenie
g++ -ldoles kodzik.cpp i otrzymałem taki zestaw błędów:

/tmp/ccQRP8sN.o: In function `main':
kodzik.cpp:(.text+0x72): multiple definition of `main'
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../libdoles.a(main.o):/home/bartek/Projects/libdoles/src/main.cc:5: first defined here
/usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../../i686-pc-linux-gnu/bin/ld: Warning: size of symbol `main' changed from 57 in /usr/lib/gcc/i686-pc-linux-gnu/4.1.2/../../../libdoles.a(main.o) to 408 in /tmp/ccQRP8sN.o
/tmp/ccQRP8sN.o: In function `main':
kodzik.cpp:(.text+0xd0): undefined reference to `doles::konwertuj_bin(std::basic_string<char, std::char_traits<char>, std::allocator<char> >)'
kodzik.cpp:(.text+0x14c): undefined reference to `doles::error::co()'
collect2: ld returned 1 exit status

Czyżby Anjuta jakoś po swojemu skompilowała bibliotekę ?

-----------EDIT--PROBLEM ROZWIĄZANY---------
Pokusiuło mnie poszukanie w google informacji na temat bibliotek statycznych w Linuksie i trafiłem na stronkę:
http://home.agh.edu.pl/~gjn/dydaktyka/TechKomp/node14.html
i tutaj się dowiedziałem, że bibliotek statyczny nie tworzy się za pomocą kompilatora tyko archiwizera binarnego o nazwie "ar". Ale na stronie jest ten błąd, że każą podać opcję do linkowania -libcostam czyli nazwę uzyskaną po pracy ar`a a jednak Wolverine miałeś racje, że trzeba dodać opcję -lnazwa. Skopiowałem plik .a (ten nowy utworzony arem) do /usr/lib a nagłówek do /usr/include i program kompiluje się poleceniem g++ -o program kodzik.o -ldoles i wszystko śmiga aż miło :) Oczywiście najpierw skompilowałem plik kodzik.cpp poleceniem g++ -c kodzik.cpp

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