Jak korzystać z bibliotek
Z jakiegoś powodu nigdy nie jestem w stanie korzystać z zewnętrznych bibliotek w żadnym języku. Szukam instrukcji / wyjaśnień, jak korzystać z zewnętrznych bibliotek, a także jak działają. Kiedy szukam w Internecie, dostaję fragmenty, które nigdy nie pasują do żadnej biblioteki, którą pobieram i próbuję używać. Pracuję zarówno na Macu jak i pc, a przykłady C++ są w porządku. Używam Eclipse IDE z wtyczką C++. Jeśli istnieją instrukcje, które mają zastosowanie do wszystkich bibliotek, to byłoby świetnie.
3 answers
Powiedzmy, że masz klasę Unuseful
zdefiniowaną następująco:
Plik Unuseful.h
:
class Unuseful {
public:
void printUnusefulStatement();
};
Plik Unuseful.cpp
:
#include "unuseful.h"
#include <iostream>
void Unuseful::printUnusefulStatement()
{
std::cout << "Hello world!" << std::endl;
}
Teraz masz inną klasę, która wymaga wydrukowania nietypowych stwierdzeń:
Unuseful u;
u.printUnusefulStatement();
Oznacza to, że chcesz użyć zewnętrznej biblioteki zawierającej konkretną implementację (printUnusefulStatement
), którą chcesz umieścić w swoim kodzie.
- dostarczając kod źródłowy kompilatorowi
- By w związku z tym, że nie jest to możliwe, nie jest to możliwe.]}
Przypadek 1: używanie biblioteki podczas kompilacji
To najprostszy przypadek. Masz kod źródłowy biblioteki, którego musisz użyć i po prostu musisz skompilować go razem z istniejącym kodem(powiedzmy plikmain.cpp
).
Zazwyczaj jesteś autorem i użytkownikiem biblioteki (klasy, która wykonuje zadanie, którego potrzebujesz).
Kompilowanie z tym polecenie:
g++ main.cpp unuseful.cpp
Pozwala na użycie implementacji, której potrzebujesz w pliku main.cpp
.
Przypadek 2: łączenie biblioteki
Częściej niż Przypadek 1 , nie masz kodu źródłowego biblioteki, której chcesz użyć. Masz tylko plik nagłówkowy (Unuseful.h
, aby kontynuować przykład) i bibliotekę statyczną lub współdzieloną (prawdopodobnie odpowiednio pliki [*] libunuseful.a
i libunuseful.so
).
Biblioteka statyczna jest archiwum plików obiektowych (*.o
), które są połączone wewnątrz końcowych plików wykonywalnych, biblioteki współdzielone są ładowane dynamicznie-w czasie wykonywania (spójrz na ta strona dla lepszego zrozumienia różnicy).
Biblioteki statyczne są tworzone przez zwykłe archiwizowanie plików {[17] } za pomocą programu ar
:
# Create the object files (only one here)
g++ -c unuseful.cpp
# Create the archive (insert the lib prefix)
ar rcs libunuseful.a unuseful.o
Biblioteki współdzielone tworzone są z g++
-shared
wariant:
# Create the object file with Position Independent Code[**]
g++ -fPIC -c unuseful.cpp
# Crate the shared library (insert the lib prefix)
g++ -shared -o libunuseful.so unuseful.o
Załóżmy, że teraz masz plik Unuseful.h
i bibliotekę współdzieloną (libunuseful.so
plik) i masz plik {[12] } tworzy instancję obiektu Unuseful
i wywołuje metodę printUnusefulStatement
.
Jeśli spróbujesz skompilować ten plik (g++ main.cpp
) linker będzie narzekał, ponieważ nie może znaleźć symbolu printUnusefulStatement
.
Czas skorzystać z biblioteki:
g++ main.cpp -L. -lunuseful
Opcja -L
mówi linkerowi, gdzie szukać plików bibliotecznych, a znacznik -l
mówi linkerowi nazwę bibliotek, które mają być używane (bez prefiksu lib
).
Teraz wykonywalny (a.out
, bo nie podałem innego nazwa) została utworzona, a do zaimplementowania potrzebnej funkcjonalności została użyta biblioteka (printUnusefulStatement
).
Ponieważ biblioteka współdzielona jest ładowana w czasie wykonywania, wykonanie pliku wykonywalnego a.out
może się nie udać, ponieważ system nie jest w stanie znaleźć biblioteki.
Zazwyczaj można to rozwiązać poprzez odpowiednie ustawienie zmiennej środowiskowej wskazującej, które ścieżki mają być użyte do wyszukiwania bibliotek dynamicznych:
# Set the LD_LIBRARY_PATH [*]
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.
Zrobione, teraz Twój plik wykonywalny został skompilowany i będzie mógł uruchomić i załadować biblioteka, której potrzebuje.
Podsumowanie
Jest to szybki przegląd Bibliotek, który, mam nadzieję, pomoże Ci zrozumieć, w jaki sposób są one wykorzystywane i udostępniane innym.
Istnieje wiele aspektów, które należy zbadać bardziej szczegółowo, jeśli jesteś zainteresowany: g++
opcje podczas tworzenia bibliotek współdzielonych, ar
opcje, zmienne środowiskowe, format bibliotek współdzielonych i tak dalej.
[*]: w środowisku uniksowym
[**]: jeśli obsługiwane dla maszyny docelowej, emitują kod niezależny od pozycji, odpowiedni do dynamicznego łączenia i unikania ograniczeń wielkości globalnej tabeli offsetowej. Ta opcja robi różnicę w m68k, PowerPC i SPARC. Kod niezależny od pozycji wymaga specjalnego wsparcia i dlatego działa tylko na niektórych maszynach. [ze strony man g++ ]
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
2012-04-28 11:20:18
Tu zaczynasz http://en.wikipedia.org/wiki/Library_
Zasadniczo 'Biblioteka' jest zbiorem skompilowanych funkcji i deklaracji klas.
Na Macu są również "frameworki", które są nieco podobne do jednostek Pascala i zawierają zarówno deklaracje, jak i skompilowany kod.
W językach zarządzanych, takich jak Java czy C#, istnieją pakiety i zespoły. Oba są ściśle związane z bibliotekami.
Aby używać bibliotek w C lub c++ musisz mieć .lib-file (or .a-file dla większości kompilatorów opartych na POSIX lub GCC toolchain) oraz prototypów funkcji, które są kompilowane doplik lib. W zależności od środowiska programistycznego (dla Eclipse najprawdopodobniej używasz kompilatora GCC i GNU toolchain z LD linkerem), wystarczy podać pliki biblioteki (.lib lub .a) jako wejście do łącznika. Przez większość czasu bibliotece towarzyszą pliki nagłówkowe, które zawierają definicje funkcji prototypy.
Nawet jeśli nie wiedziałeś o linkerze, co jest dość dziwne, biblioteki nadal są używane w twoim programie domyślnie-std:: cout znajduje się w libstdc++ lub bibliotece wykonywanej w C.
Jako przykład ogromnej biblioteki i użytecznego zestawu klas C++ warto spojrzeć na Boost.
Do napisania GUI w systemie Windows można użyć WinAPI, które jest opisane w MSDN.
Do pisania GUI na Macu można użyć CARBON API, które jest nieco podobne do WinAPI, ale jest obecnie przestarzały. Jedynym sposobem na napisanie "legit" GUI dla MacOS jest użycie Cocoa i Objective-C. {]}
Do pisania wieloplatformowego GUI można użyć wielu bibliotek: Qt, wxWidgets, GTK wśród nich.
Ostatni, ale nie najmniej. C++ nie jest najlepszym językiem dla GUI.
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
2017-06-16 19:23:08
Najlepszym sposobem korzystania z zewnętrznych bibliotek C++ jest skorzystanie z menedżera pakietów C++, zapoznaj się z nimi;
Niektóre z nich dotyczą korzystania z CMake, można znaleźć dobrze napisany tutorial na ten temat tutaj .
.
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
2018-11-08 10:42:05