Verknüpfen Sie die .so-Datei mit der .cpp-Datei über g++-Kompilierung

Lesezeit: 3 Minuten

Benutzer-Avatar
Grundkarl

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 + filenamezum Beispiel ist mein Dateiname directory/libtest.so es wäre -ldirectory/libtest.soist 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

  • 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


jetzt von dem, was ich sehen kann, ist der Befehl -l + filenamezum 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 -laber 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.

  • Nun, es ist ziemlich klar dokumentiert, wenn Sie sich die Mühe machen, die GCC-Dokumentation zu lesen gcc.gnu.org/onlinedocs/gcc/Link-Options.html

    – Jonathan Wakely

    30. November 2014 um 1:52 Uhr

  • Seien Sie sich auch bewusst, dass Sie dies nicht tun werden enthalten die .so in Ihrer eigenen .so, Sie werden nur darauf verlinken, wodurch Ihre .so von der anderen abhängig wird, nicht deren Inhalt.

    – Jonathan Wakely

    30. November 2014 um 1:53 Uhr


  • Hey @JonathanWakely, ich glaube, ich habe genau das getan, was du gesagt hast. stackoverflow.com/questions/47967646/… dennoch ist ein Fehler aufgetreten. Kannst du bitte Licht ins Dunkel bringen?

    – Emma He

    26. Dezember 2017 um 9:54 Uhr


Dies ist eine Schritt-für-Schritt-Anleitung zum Erstellen und Verknüpfen einer .so mit .cpp-Datei

  1. 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

  2. Erstellen Sie .so mit dem folgenden Befehl
    gcc -c -fPIC add.cpp -o add.o

    Dadurch wird liadd.so erstellt

  3. 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

  4. Erstellen Sie mit diesem Befehl eine .o-Datei aus dieser Datei
    g++ -c main_file.cpp

  5. 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

  6. Führen Sie das Programm mit dem Befehl aus
    ./prog

  • Danke, dieses Beispiel war sehr nützlich für mich. Ich denke, es fehlt ein Schritt: 2.a gcc -shared -o libadd.soo add.o

    – Benutzer2024223

    19. Oktober 2021 um 7:40 Uhr


1012750cookie-checkVerknüpfen Sie die .so-Datei mit der .cpp-Datei über g++-Kompilierung

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy