2010-11-22 10 views
3

Ich weiß, dass dies eine sehr dumme Frage sein könnte, aber ich bin neu in kompilierten Sprachen (meine Domäne ist meist Skriptsprachen wie PHP, Python oder JavaScript).Frage über kompilierte Programmnutzung von externen Bibliotheken

Ich lerne C++ für ein Projekt, wo es die einzige Sprache ist, die ich verwenden kann.

Ich schrieb ein Programm in Ubuntu 10.10 und kompilierte es dann. Ich kann die erzeugte Binärdatei von cmd wie folgt ausführen und es funktioniert:

sudo ./compiled-program 

Aber habe ich einige externe Bibliotheken im Programm (OpenCV) verwendet. Bedeutet das, dass auf allen Computern, auf denen ich das Programm ausführen werde, OpenCV installiert sein muss? Oder ist OpenCV in der kompilierten Binärdatei enthalten? Funktioniert es auf PCs ohne OpenCV?

+0

bearbeitet Ihre Entschuldigung für eine dumme Frage, weil es nicht ist. :) –

+0

Das ist nachdrücklich keine dumme Frage. – jason

Antwort

2

Sie sollten ein paar Dinge über libraries lesen und insbesondere, was den Unterschied zwischen statischen und dynamischen Bibliotheken ausmacht. Um die grundlegenden Definitionen zu zitieren, so dass Sie erhalten den Punkt:

Eine statische Bibliothek, auch bekannt als Archiv besteht aus einem Satz von Routinen , die in eine Ziel Anwendung durch den Compiler, Linker kopiert werden, oder Binder, Erstellen von Objektdateien und eine eigenständige ausführbare Datei.

[...]

Dynamische Verknüpfung umfasst die Subroutinen einer Bibliothek geladen (die als DLL bezeichnet werden kann, vor allem unter Windows oder als DSO (Dynamic Shared Objekt) unter Unix-ähnliche Systeme) in ein Anwendungsprogramm zur Ladezeit oder Laufzeit, anstatt sie in bei der Kompilierung verbindet.

1

Wenn Sie gegen OpenCV "kompiliert" haben, dann brauchen Maschinen, die Ihre App laufen lassen. Sie müssen die Bibliotheken kopieren, wenn Sie Ihre App installieren, oder sicherstellen, dass sie bereits installiert sind.

1

Es hängt davon ab, ob Sie mit einer gemeinsam genutzten (dynamischen) Bibliothek kompilieren oder sie in Ihre ausführbare Datei kompilieren (kompilieren mit einer statischen Bibliothek). Wenn Sie mit einer gemeinsam genutzten Bibliothek kompilieren, müssen Sie die gemeinsam genutzte Bibliothek verteilen ... sonst .. Sie nicht.

+0

Ich habe gerade drei Header in der cpp-Datei hinzugefügt, wie zum Beispiel: #include und dann OpenCV-Funktionen in der cpp-Datei verwendet. Bedeutet das, dass ich eine dynamische oder statische Bibliothek verwendet habe? –

+0

Es bedeutet weder ... die Wahl von statisch oder dynamisch kommt auf den Linker und nicht den Compiler. – Goz

+0

Das ist nicht gut. Ich habe keine Ahnung, welcher Linker verwendet wurde, ich kompiliere in Anjuta IDE, indem ich auf den Compile-Button klicke. –

1

Es gibt zwei Arten von Bibliotheken, statische und dynamisch geladene. Statisch geladene Bibliotheken werden mit Ihrer Binärdatei verknüpft, während dynamisch geladene Bibliotheken zur Laufzeit geladen werden.

2

Keine blöde Frage!

Der "normale" Weg dies funktioniert - ist, dass Ihr Programm gegen eine "Shared Library" gelinkt wurde - in diesem Fall, ja, der Benutzer benötigt die OpenCV (oder welches Bundle auch die Shared Library enthält).

Wenn Sie sich als ausführbaren statischen kompilieren, Flag (das -static verwendet wird), dann ist es, und alle Bibliotheken würden direkt in der ausführbaren Datei enthalten sein, ein bisschen von einer größeren ausführbaren Datei, der Abfälle mehr Speicher zu machen, weil es keine shared Bibliothek verwendet.

Es gibt Möglichkeiten, wie Sie Ihr Programm zusammenstellen könnten nur Ihre OpenCV-Bibliotheken als statisch zu verknüpfen - aber das ist nur möglich, wenn das Bündel eine statische Bibliothek „.a“ ​​enthalten im Vergleich zu einem gemeinsamen one „.so“ .

1

Es hängt davon ab, ob die ausführbare Datei statically-built oder dynamically linked ist. In einer statisch erstellten ausführbaren Datei ist es der Fall, dass die Bibliotheksdateien, die ausführbare Dateien benötigen, in die ausführbare Datei kompiliert werden und keine zusätzlichen Bibliotheksdateien mitgeführt werden müssen. In einer dynamisch verknüpften ausführbaren Datei ist es der Fall, dass die Bibliotheksdateien, deren ausführbare Dateien zur Laufzeit verbunden sind, zur Laufzeit eine Kopie der Bibliotheksdateien benötigen.

2

Wenn Sie Ihren Code gegen Abhängigkeiten wie OpenCV erstellen mussten, hängt es davon ab, ob Sie statische oder dynamische Verknüpfungen erstellt haben.

Sehen Sie hier, welche Abschnitte abdeckt, diese Ideen hat: http://en.wikipedia.org/wiki/Library_(computing)

Für den Anfang, versuchen Sie dies auf der Kommandozeile tun:

ldd compiled-program

Sie Ausgabe wie folgt erhalten (als Beispiel, ich habe ldd auf meinem python binär in /usr/bin):

[email protected]:/usr/bin$ ldd python 
     linux-gate.so.1 => (0xb7ff7000) 
     libpthread.so.0 => /lib/i686/cmov/libpthread.so.0 (0xb7fd5000) 
     libdl.so.2 => /lib/i686/cmov/libdl.so.2 (0xb7fd1000) 
     libutil.so.1 => /lib/i686/cmov/libutil.so.1 (0xb7fcd000) 
     libssl.so.0.9.8 => /usr/lib/i686/cmov/libssl.so.0.9.8 (0xb7f82000) 
     libcrypto.so.0.9.8 => /usr/lib/i686/cmov/libcrypto.so.0.9.8 (0xb7e2a000) 
     libz.so.1 => /usr/lib/libz.so.1 (0xb7e16000) 
     libm.so.6 => /lib/i686/cmov/libm.so.6 (0xb7df0000) 
     libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7caa000) 
     /lib/ld-linux.so.2 (0x80000000) 

Python will eine Menge zusätzlicher Sachen, wie libssl (Teil von OpenSSL), die GNU C-Bibliothek (libc) und einige andere.

Jetzt, wenn Sie diese Sache auf andere Systeme verschieben werden, hoffen Sie entweder, dass sie eine Ihrer Umgebung ähnliche Umgebung haben, verteilen Sie sie als Quelle und verwenden Sie etwas wie das autotools/GNU Build System, um es zu bauen Sie können auf all das verzichten und alles statisch in Ihre Binärdatei einbinden, die all das mit sich bringt, was Ihre ausführbare Datei benötigt, ohne eine dynamische Verknüpfung zu benötigen.