Ich versuche, eine Bibliothek in meinem C++-Projekt zum Laufen zu bringen, und es gibt keine klaren Anweisungen, wie dies für Leute zu tun ist, die nicht an C++ gewöhnt sind
folgende Verknüpfung ist das nächste, was ich gekommen bin
darin steht folgendes
-L/path/to/my/library/folder -ldllname
auch der folgende Thread besagt Folgendes
gcc yourfile.cpp -lblah
jetzt von dem, was ich sehen kann, ist der Befehl -l
+ filename
zum Beispiel ist mein Dateiname directory/libtest.so
es wäre -ldirectory/libtest.so
ist das richtig, könnte das mal jemand klären
Ich verwende derzeit den folgenden Befehl, um meine zu kompilieren maincpp.cpp
Datei, möchte aber zB eine .so-Datei namens enthalten ./directory/libtest.so
g++ -fPIC -o libgetmacip.so -shared -I $JAVA_HOME/include -I $JAVA_HOME/include/linux maincpp.cpp cpptoinclude.cpp
jetzt von dem, was ich sehen kann, ist der Befehl -l + filename
zum Beispiel ist mein Dateiname directory/libtest.so
es wäre -ldirectory/libtest.so
Nein, das ist nicht richtig. Es sollte sein -Ldirectory -ltest
dh Sie verwenden -L
um den Suchpfaden ein Verzeichnis hinzuzufügen, in dem der Linker nach Bibliotheken sucht, und Sie sagen, mit welchen Bibliotheken verknüpft werden soll -l
aber zu verlinken libtest.so
oder libtest.a
du sagst -ltest
ohne das lib
Präfix oder die Dateierweiterung.
Du kann Link durch explizite Benennung der Datei, ohne -L
oder -l
Optionen, dh nur directory/libtest.so
, aber für dynamische Bibliotheken ist das fast immer falsch, da es genau diesen Pfad in die ausführbare Datei einbettet, sodass sich dieselbe Bibliothek an derselben Stelle befinden muss, wenn das Programm ausgeführt wird. Normalerweise möchten Sie mit dem Namen (nicht mit dem Pfad) darauf verlinken, damit die Bibliothek mit diesem Namen zur Laufzeit von jedem Ort aus verwendet werden kann.
Dies ist eine Schritt-für-Schritt-Anleitung zum Erstellen und Verknüpfen einer .so mit .cpp-Datei
-
Erstellen Sie eine .cpp-Datei, die Sie in .so konvertieren möchten.
Beispiel –
#include<stdio.h>
int add(int a , int b)
{ return a+b;}
Speichern Sie es unter dem Namen add.cpp
-
Erstellen Sie .so mit dem folgenden Befehl
gcc -c -fPIC add.cpp -o add.o
Dadurch wird liadd.so erstellt
-
Erstellen Sie eine .cpp-Datei, die diese .so-Datei verwendet
Beispiel-
#include<stdio.h>
extern int add(int a, int b);
int main(int argc, char** argv)
{
printf("Hello the output is %d \n",add(10,15));
return 0;
}
Speichern Sie es als main_file.cpp
-
Erstellen Sie mit diesem Befehl eine .o-Datei aus dieser Datei
g++ -c main_file.cpp
-
Verknüpfen Sie .so mit .o mit diesem Befehl
g++ -o prog main_file.o -L. -ladd
Hier gibt L den Ordner mit der .so-Datei an
Und -l gibt den Namen der .so-Bibliothek an
-
Führen Sie das Programm mit dem Befehl aus
./prog
Sie müssen bedenken, dass das Angeben einer dynamischen Bibliothek an eine Binärdatei nur bedeutet, dass diese Binärdatei zur Ausführungszeit gelinkt werden soll eine Bibliothek dieses Namens (nicht das Bücherei). Zur Ausführungszeit muss eine solche Bibliothek in der vorhanden sein System (zB im LD_LIBRARY_PATH), daher macht es wenig Sinn, dafür ein bestimmtes Verzeichnis anzugeben.
– Alfe
30. November 2014 um 1:07 Uhr