Jak utworzyć bibliotekę?

Powiedzmy, że mam 10 *.hpp i *.pliki cpp, które muszę skompilować kod. Wiem, że będę potrzebował tych samych plików dla wielu różnych kodów. Czy mogę utworzyć "pakiet" z tymi plikami, które pozwolą mi po prostu napisać

#include<mypackage>

Zamiast

#include"file1.hpp"
#include"file2.hpp"
...
#include"file10.hpp"

Nie musiałbym wtedy pisać makefile za każdym razem, gdy potrzebuję tego "pakietu".

Mówiąc dokładniej, używam Linuksa.

Author: PinkFloyd, 2013-05-22

5 answers

Zbiór źródeł CPP (pliki H I PLIKI CPP) może być skompilowany razem w "bibliotece", która następnie może być używana w innych programach i bibliotekach. Szczegóły tego, jak to zrobić, są specyficzne dla platformy i łańcucha narzędzi, więc pozostawiam Ci poznanie szczegółów. Jednak podam kilka linków, które możesz przeczytać:

Tworzenie współdzielonej i statycznej biblioteki z kompilatorem gnu [GCC]

Walkthrough: Tworzenie i używanie dynamicznego łącza Biblioteka (C++)

Biblioteki mogą być rozdzielone na dwa typy: biblioteki kodu źródłowego i biblioteki binarne. Mogą też istnieć hybrydy tych dwóch typów-biblioteka może być zarówno biblioteką źródłową, jak i binarną. Biblioteki kodu źródłowego są po prostu: zbiorem kodu rozpowszechnianym jako kod źródłowy; zazwyczaj pliki nagłówkowe. Większość bibliotek Boost jest tego typu. Biblioteki binarne są kompilowane do pakietu, który jest ładowany w trybie runtime przez program kliencki.

Nawet w w przypadku bibliotek binarnych (i oczywiście w przypadku bibliotek źródłowych), plik nagłówkowy (lub wiele plików nagłówkowych) musi być dostarczony użytkownikowi biblioteki. To mówi kompilatorowi programu klienckiego, jakich funkcji itd szukać w bibliotece. To, co często robią pisarze Bibliotek, to pojedynczy, główny plik nagłówkowy składający się z deklaracji wszystkiego, co jest eksportowane przez bibliotekę, a Klient #include tego nagłówka. Później, w przypadku bibliotek binarnych, klient program" połączy się " z biblioteką, co spowoduje przeniesienie wszystkich nazw wymienionych w nagłówku na adresy wykonywalne.

Podczas tworzenia pliku nagłówkowego po stronie Klienta Należy pamiętać o złożoności. Może być wiele przypadków, w których niektórzy z Twoich klientów chcą korzystać tylko z kilku części biblioteki. Jeśli skomponujesz jeden plik nagłówka głównego, który zawiera wszystko z twojej Biblioteki, czas kompilacji Twoich klientów będzie niepotrzebnie zwiększony.

Powszechny sposób radzenia sobie z tym problemem jest dostarczenie pojedynczych plików nagłówkowych dla skorelowanych części biblioteki. Jeśli myślisz o wszystkich Boost jednej biblioteki, To Boost jest tego przykładem. Boost jest ogromną biblioteką, ale jeśli wszystko, co chcesz, to funkcjonalność regex, możesz tylko #include nagłówek(y) związany z regex, aby uzyskać tę funkcjonalność. Nie musisz zawierać wszystkich Boost, jeśli chcesz tylko rzeczy regex.

Zarówno pod Windows, jak i Linuksem, biblioteki binarne można dalej podzielić na dwa typy: dynamiczne i statyczne. W przypadku bibliotek statycznych, kod biblioteki jest faktycznie "importowany" (z braku lepszego terminu) do programu wykonywalnego klienta. Statyczna Biblioteka jest dystrybuowana przez Ciebie, ale jest to potrzebne tylko przez Klienta podczas kompilacji. Jest to przydatne, gdy nie chcesz zmuszać klienta do dystrybucji dodatkowych plików za pomocą swojego programu. Pomaga również uniknąć piekła zależności . Dynamiczna biblioteka natomiast jest Nie "importowane" bezpośrednio do programu klienta, kupowane dynamicznie ładowane przez program klienta podczas jego wykonywania. Zmniejsza to zarówno rozmiar programu klienckiego, jak i potencjalnie ślad dysku w przypadkach, gdy wiele programów korzysta z tej samej biblioteki dynamicznej, ale biblioteka binarna musi być dystrybuowana i instalowana wraz z programem klienckim.

 20
Author: John Dibling,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-22 15:28:11

Zakładając Twój " plik1.hpp " i " file2.hpp " itp. są ściśle ze sobą powiązane i (prawie) zawsze używane razem, a następnie tworzą jeden "mypacakge.h", który zawiera includes innych komponentów, jest dobrym pomysłem(samo w sobie nie przekształca się w bibliotekę - to zupełnie inny proces).

Jeśli nie są one ściśle powiązane i/lub używane razem, to nie powinieneś mieć takiego "Mega include", ponieważ po prostu przeciąga się w kilka rzeczy, które nie są potrzebne.

Aby biblioteka polega na jednokrotnym zbudowaniu kodu i albo wygenerowaniuplik lib lub udostępniona biblioteka (.plik dll or. so). Dokładne kroki, aby to zrobić, zależą od tego, jakiego systemu używasz, i jest to trochę zbyt skomplikowane, aby wyjaśnić tutaj.

Edit: aby wyjaśnić dalej: cała biblioteka C++ jest w rzeczywistości jednym plikiem biblioteki lub plikiem biblioteki współdzielonej[wraz z wieloma plikami nagłówkowymi, które zawierają część kodu i deklaracje potrzebne do użycia kodu w bibliotece]. Ale ty to <iostream> i <vector> osobno - byłoby całkiem okropnie, gdyby w jednym <allcpplibrary> umieszczano wszystko ze wszystkich nagłówków bibliotek C++, nawet gdyby było to o wiele mniej związane z pisaniem. Jest on podzielony na sekcje, które robią jedną rzecz na plik nagłówka. Tak więc otrzymujesz "kompletny" zestaw z jednego pliku nagłówkowego, ale nie za dużo innych rzeczy, których tak naprawdę nie potrzebujesz.

 1
Author: Mats Petersson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-22 13:42:18

Jeśli klient potrzebuje wszystkich dziesięciu nagłówków, aby rzeczywiście skorzystać z "pakietu" (biblioteki), to jest to dość zły projekt interfejsu.

Jeśli klient potrzebuje tylko niektórych nagłówków, w zależności od tego, które części biblioteki są używane, pozwól klientowi dołączyć odpowiednie nagłówki, więc wprowadzany jest tylko minimalny zestaw identyfikatorów. Pomaga to zakresowi, modularyzacji i czasom kompilacji.

Jeśli Wszystko inne zawiedzie, możesz zrobić "nagłówek interfejsu" do użytku zewnętrznego, który jest różni się od tych, których używasz wewnętrznie do kompilacji biblioteki. To będzie ten, który zostanie zainstalowany i składa się z niezbędnej zawartości z innych nagłówków. (Nadal nie sądzę, że potrzebujesz wszystkiego z KAŻDEGO nagłówka w lib.)

Odradzam rozwiązanie Salgara. Możesz albo mieć pojedyncze nagłówki, lub monolityczne. Dostarczanie pojedynczych nagłówków plus centralnego, który zawiera po prostu inne wydaje mi się dość kiepski układ.

To, co robię , a nie rozumiem, to, że w to wgrywają pliki Makefile. Zależności nagłówka powinny być rozwiązywane automatycznie przez Twój system Makefile / build, tzn. nie powinno tu mieć znaczenia jak Twoje pliki nagłówkowe są rozmieszczone.

 0
Author: DevSolar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-22 13:41:45

Tak i nie.

Możesz napisać nagłówek include-all tak, że #include "myLib.h" jest wystarczający, ponieważ wszystkie te nagłówki są dołączane przez pojedynczy nagłówek. Nie oznacza to jednak, że singel "include" wystarczy, aby miał Zawartość 10".pliki cpp powiązane z Twoim projektem automatycznie. Będziesz musiał skompilować je do biblioteki i połączyć tę pojedynczą bibliotekę (zamiast wszystkich plików obiektowych) z projektami, które używają "myLib.h". Binaria biblioteki są statyczne i dynamiczne biblioteki, pliki są zwykle nazywane .lib i .dll (windows) oraz .a i .so (linux) odpowiednio dla bibliotek statycznych i dynamicznych.

Jak budować i linkować takie biblioteki zależy od Twojego systemu budowania, możesz chcieć umieścić te warunki w sieci.

Alternatywą jest pozbycie się Plików .cpp przez zdefiniowanie wszystkich funkcji w nagłówkach. W ten sposób nie będziesz musiał łączyć dodatkowej biblioteki, ale odbywa się to kosztem wydłużonego czasu kompilacji, ponieważ kompilator będzie musiał przetwarzać wszystkie te funkcje za każdym razem, gdy dołączysz nagłówek bezpośrednio lub pośrednio do jednej z twoich jednostek tłumaczeniowych.

 0
Author: Arne Mertz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-22 13:46:11

Na Linuksie:

G++ FLAGS-shared-WL,- soname,libLIBNAME.so.1-o libLIBNAME.VERSION OBJECT_FILES

Gdzie

Flagi: typowe flagi (np.-g, - Wall, - Wextra, itp.)

LIBNAME: nazwa biblioteki

OBJECT_FILES: pliki obiektów powstałe w wyniku kompilacji plików cpp

VERSION: Wersja twojej Biblioteki

 0
Author: Claudio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-22 13:59:50