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.

Author: Mogsdad, 2012-04-27

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.

Możesz korzystać z tej biblioteki na dwa sposoby:]}
  1. dostarczając kod źródłowy kompilatorowi
  2. 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 plik main.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++ ]

 184
Author: Vincenzo Pii,
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.

 6
Author: Viktor Latypov,
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 .

.

 2
Author: adembudak,
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