shared Libraries einbinden

Schnelle objektorientierte, kompilierende Programmiersprache.
MoMo
Beiträge: 23
Registriert: Mo Mai 07, 2018 9:49 am

shared Libraries einbinden

Beitrag von MoMo » Mo Mai 07, 2018 10:09 am

Hallo,

OS: Ubuntu

1. ich habe ein Porjekt "/home/system/my_project/example.cpp" angelegt.
2. Ich habe eine shared Library gedownloaded und bauen lassen, "/home/system/libexample"
So habe ich die Lib nach dem downloaden gebaut:
Im Verzeichnis der Bibliothek
- mkdir build
- cd build
- cmake DCMAKE_BUILD_TYPE=Release ..
- cmake --build .

nun habe ich dort im build Verzeichnis in dem Bibliotheksverzeichnises eine libexample.so.0.3.0 Datei. Mitgelieferte examples der Bibliothek laufen auch.

Ich möchte diese Bib nun in meinem eigenen Projekt einbinden, wie mache ich das? Das ich die ganzen Header der Lib nutzen kann.
Ich habe diverse Sachen gelesen, aber werde nicht ganz schlau daraus.

1. Das man die .so Datei in /usr/lib verschieben soll
2. und irgendwie kam noch eine weitere Datei ins Spiel /etc/ld.so.conf...

Kann mir nur einer sagen, wie ich die shared Library in mein Projekt einbinde? Das der Compiler diese findet und dann mein Projekt ausführt?!

In Kommandozeilen Befehlen bin ich leider auch nicht so erfahren.

würde mich über eine Antwort freuen und hoffe ich habe mein Problem genau genug erklärt.

nufan
Wiki-Moderator
Beiträge: 2436
Registriert: Sa Jul 05, 2008 3:21 pm

Re: shared Libraries einbinden

Beitrag von nufan » Mo Mai 07, 2018 10:28 am

Hallo! :)
Wie baust du denn dein Projekt? Verwendest du eine Entwicklungsumgebung?

Falls du gcc verwendest, übergibst du:
  • -I mit dem Verzeichnis, in dem sich die Header der Bibliothek befinden
  • -L mit dem Verzeichnis, in dem die kompilierte Bibliothek (.so) liegt
  • -lexample, damit die Bibliothek zu deinem Programm gelinkt werden soll.

MoMo
Beiträge: 23
Registriert: Mo Mai 07, 2018 9:49 am

Re: shared Libraries einbinden

Beitrag von MoMo » Mo Mai 07, 2018 10:54 am

vielen Dank für die schnelle Antwort :)
ich wollte eigentlich sowas wie Eclipse benutzen, jedoch hab ich es da auch nicht 100% hinbekommen und will es jetz über Kommandozeile mit gcc probieren.
ich habe folgendes eingegeben:
g++ example.cpp -I /home/system/libexample/include/(hier liegen die header) -L /home/system/libexample/build/ (hier liegten zwei .so) -lexample -o test

ich habe im c++ code die Header folgend inkludiert:
#include <example/beispielheader.h>
dann spuckt der mir folgendes aus:
In file included from /usr/include/c++/5/thread:35:0,
from example.cpp:6:
/usr/include/c++/5/bits/c++0x_warning.h:32:2: error: #error This file
requires compiler and library support for the ISO C++ 2011 standard.
This support must be enabled with the -std=c++11 or -std=gnu++11
compiler options.
#error This file requires compiler and library support \
^
thesis.cpp:11:30: fatal error: example/exception.h: Datei oder
Verzeichnis nicht gefunden
compilation terminated.

Die exeption.h is einer der Headerdateien in dem Ordner.

wenn ich die im Code so inkludiere
#include <beispielheader.h>
findet er die in den Headern includierten Header nicht, also die Header includieren sich auch alle mit 'include<example/XXX.h> in der Lib.
Muss ich die Header jetz alle anpassen und dei Lib neu bauen?

MoMo
Beiträge: 23
Registriert: Mo Mai 07, 2018 9:49 am

Re: shared Libraries einbinden

Beitrag von MoMo » Mo Mai 07, 2018 10:58 am

Sorry das mit dem example/XXX.h hat sich erledigt, das example war nur ein weiteres Verzeichnis, habe den -I Pfad angepasst, jedoch findet er die Header in dem Ordner trotzdem nicht.

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8449
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: shared Libraries einbinden

Beitrag von Xin » Mo Mai 07, 2018 11:14 am

Kannst Du den Compileraufruf und den Verzeichnisbaum von /home/system/libexample mal posten? (z.B. mit tree, falls installiert)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

MoMo
Beiträge: 23
Registriert: Mo Mai 07, 2018 9:49 am

Re: shared Libraries einbinden

Beitrag von MoMo » Mo Mai 07, 2018 12:09 pm

hatte example immer nur als Platzhalter wie ihr euch denken könnt, so
ist der eigentliche Aufruf.

Compielraufruf
einmal so:

Code: Alles auswählen

g++ myproject.cpp -I /home/system/libfranka/include/ -L /home/system/libexample/build/ -lfranka -o test
und so:

Code: Alles auswählen

g++ myproject.cpp -I /home/system/libfranka/include/franka -L /home/system/libexample/build/ -lfranka -o test
Hier html-Dateien mittels tree

https://we.tl/aZozOTjtO4

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8449
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: shared Libraries einbinden

Beitrag von Xin » Mo Mai 07, 2018 12:35 pm

Und der Aufruf enthält im Original auch libexample? Dann ist es nämlich kein Platzhalter. ;)

Wenn Du -I /home/system/libfranka/include angibst, musst Du #include <franka/model.h> einbinden, nimmst Du /home/system/libfranka/include/franka musst Du nur #include <model.h> einbinden. Ich halte den ersten Weg für sinnvoller. Eine model.h (bzw. die anderen) findest Du sicher auch bei anderen Libs und wenn die dann auch franka heißen, dann wird's kompliziert. ;)
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

MoMo
Beiträge: 23
Registriert: Mo Mai 07, 2018 9:49 am

Re: shared Libraries einbinden

Beitrag von MoMo » Mo Mai 07, 2018 1:01 pm

vielen Dank,
ja das habe ich verstanden ich habe mich für die bessere Variante entschieden. Daraufhin kam eine Fehlermeldung das ein Header noch die Eigen Lib benutzt die hab ich dann unter usr/include/ gefunden und auch noch mit -I verlinkt im Aufruf.

Jetzt kommen nur unzählbare Fehler beim compilen. Der Code funktioniert das weiß ich, daran ist nichts falsch, weil ich einfach mal in der Lib ein Beispielprogramm damit überspielt - neu gebaut und das lief.

z.B eine der vielen Meldungen:
myproject.cpp:181:36: error: ‘const struct franka::RobotState’ has no member named ‘O_T_EE_d’
initial_pose = robot_state.O_T_EE_d;

O_T_EE ist eine Matrix die ich eig. abrufen kann.

Also stimmt immer noch irgendwas mit dem verlinken nicht, nehme ich an.
Und ich kann mir nicht vorstellen, das ich noch alles Header einbinden muss die irgendwo in den eigentlichen Headern includiert sind. Die sollten sich doch automatisch verlinken, wenn die Lib richtig eingebunden ist oder nicht?


ich bin leider nicht gut in so Lib-Verlinkungszeug, hab ich noch nie gemacht, hatte bis jetzt immer nur in Eclipse gearbeitet statt mit einem einfachen Editor und compilen über Konsole und brauchte nie weitere Libs

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8449
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: shared Libraries einbinden

Beitrag von Xin » Mo Mai 07, 2018 1:08 pm

MoMo hat geschrieben:z.B eine der vielen Meldungen:
myproject.cpp:181:36: error: ‘const struct franka::RobotState’ has no member named ‘O_T_EE_d’
initial_pose = robot_state.O_T_EE_d;

O_T_EE ist eine Matrix die ich eig. abrufen kann.

Also stimmt immer noch irgendwas mit dem verlinken nicht, nehme ich an.
Dann würdest Du einen Linker-Fehler bekommen. Du bekommst aber einen Compilerfehler.

Ich nehme an, die struct franka:RobotState ist deklariert (struct RobotState;), aber nicht definiert (struct RobotState { .... };)
Da scheint also ein Include nicht gesetzt zu sein oder nicht gefunden zu werden.
MoMo hat geschrieben: Und ich kann mir nicht vorstellen, das ich noch alles Header einbinden muss die irgendwo in den eigentlichen Headern includiert sind. Die sollten sich doch automatisch verlinken, wenn die Lib richtig eingebunden ist oder nicht?
Ja, wenn Du die Lib auch richtig geschrieben hast.
MoMo hat geschrieben:ich bin leider nicht gut in so Lib-Verlinkungszeug, hab ich noch nie gemacht, hatte bis jetzt immer nur in Eclipse gearbeitet statt mit einem einfachen Editor und compilen über Konsole und brauchte nie weitere Libs
Programmieren lernt man nicht durch richtig machen, sondern durch Fehler beseitigen.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

MoMo
Beiträge: 23
Registriert: Mo Mai 07, 2018 9:49 am

Re: shared Libraries einbinden

Beitrag von MoMo » Mo Mai 07, 2018 2:55 pm

Ja deine Tipps sind bis jetz auch immer sehr gut.

ich die ganzen Fehler mal analysiert und es liegt teils daran das ich c++11 brauche, habe dann -std=c++11 in den Compileraufruf gemacht und erhalte nun folgendes:
/usr/bin/ld: cannot find -lfranka
collect2: error: ld returned 1 exit status

Mein Aufruf sieht ja wie folgt aus:

gcc -std=c++11 myproject.cpp -I /home/system/libfranka/include/ -I /usr/include/eigen3 -L /home/system/libfranka/build/libfranka.so -lfranka -o test

So wie man Sieht hab ich ja mit -L den Pfad von der .so Datei angegeben, jetz frag ich mich, wieso er in /usr/bin/ld sucht? oder muss ich in irgendeine Systemdatei noch was ergänzen?

Antworten