Llept statisch linken/anders einbinden um Installation auf neuem pC zu vermeiden

linu

Newbie
Registriert
Aug. 2014
Beiträge
6
Hallo liebe Mitglieder,

mein Titel ist leider etwas unguenstig gewaehlt ;)

Also ich habe folgendes Problem... ich habe ein Programm, welche mittels Leptonica und Tesseract arbeitet. Nun wollte ich eine Binaerdatei oder ein statischen Link erstellen, dass wenn ich das Programm auf einem anderen Rechner benutzen moechte, dort die beiden Bibliotheken nicht extra installiert werden muessen. Dies soll alles unter Linux passieren (arbeite auf einer VM)

Ich habe schon seeeehr viel im Internet gelesen, aber irgendwie hat mir bislang noch nichts geholfen.

Die Sache ist die, Leptonica und Tesseract bestehen jeweils aus statischen und dynamischen Bibliotheken.

Nun habe ich versucht eine Binaerdtei zu erzeugen ueber: g++ -llept -ltesseract -l/usr/local/lib -g -o binary. so
eine Binaerdatei kam dabei raus , wenn ich jedoch mein Programm auf einem anderen PC starte kommen die Fehlermeldungen dass die beiden Bibliotheken fehlen.
Habe ich die Binaerdatei mit den Bibliotheken ueberhaupt richtig erstellt? Wenn ja, wie muss ich die beim Kompilieren richtig aufrufen ?

Weiterhin habe ich auch schon versucht einen statischen Link zu erstellen, was auch nicht wirklich geklappt hat.

Nun bin ich langsam mit meinem Latein am Ende und ich hoffe ihr koennt mir weiterhelfen.

Vielen Daaaank!!!
 
Nein, da macht er bei mir erst recht nichts ;D da meint er dann, dass er meine /usr/local/lib nicht finden kann.
 
Ich seh grad das da auch noch ein Fehler drin war. Da war das statt "-L" für das Library Verzeichnis "-l" für Bibliothek angegeben. Probiers mal so
g++ -static -llept -ltesseract -L/usr/local/lib -g -o binary. so
 
Wenn ich dass so eingebe, bekomme ich die Warnung dass noch getaddrinfo() zur laufzeit die dynamischen Libs von glibc benoetigt. Dann kommen super viele undifined refereces und dass ld returned 1 exti....
Demnach duerfte dass ja auch nicht geklappt haben.

Dann habe ich enfach nochmal probiert die libs zu linken ueber:
"ln -s 'g++$(CXXFLAGS) -print-file-name=ltesseract' ltesseract.a"

Ist dass der richtige Befehl zum linken gewesen und wie kann ich jetzt herausfinden, ob es wirklich gelinkt wurde? Es wurde zwar eine neune Datei bei mir im Ordner erstellt, aber wie sehe ich dass jetzt alles zusammenhaengt?
 
mit ldd kannst du dir die Abhängigkeiten zu den dynamisch gelinkten Bibliotheken anzeigen lassen. Da sollten dann eben die statisch gelinkten nicht auftauchen.

probier aber mal noch folgendes aus (Bibliotheken unter "/usr/lib" sollten normal unter extra angabe des Library Path gefunden werden bzw. ist der Pfad ein default Wert)

g++ -g,-static -llept -ltesseract,-o binary. so
Damit sollten wirklich nur die beiden angegebenen Bibliotheken statisch gelinkt werden.
 
es kommt wieder die gleiche Fehlermeldung wie schon vorhin beschrieben.
Arghhhhh....

ok nochmal die Reihenfolge durchgehen wie so etwas vorgenommen werden koennte.
Zunaechst die statischen Bibliotheken linken, dass eine binary erstellen und diese dann weitergeben.

ist diese Reihenfolge richtig ? Oder vergesse ich iwas fundamentales warum bei mir nichts funktioniert?
 
Gibt bitte mal die genaue Fehlermeldung.

Muss aber auch zugeben das ich eigentlich immer mit Makefiles oder CMake arbeite und nie mit g++ direkt.
 
Die Option zum Suchpfad "-L/such/pfad" muß mMn vor der dort zu findenden Bibliothek "-lnameDerLib" in der Kommandozeile stehen. Also "-L/pfad -lxxx" statt "-lxxx -L/pfad"

@linu
Für deine Zwecke willst du vielleicht gar kein komplett statisch gelinktes binary bauen sondern nur die beiden seltenen Bibliotheken statisch linken. Überall vorhandene, andere Bibliotheken kannst du wie gewohnt als shared library vom Zielsystem nutzen, insb. auch die libc. Sieht beim Linken etwa so aus:

gcc program.o -Wl,-Bstatic -lselteneLib1 -lselteneLib2 -Wl,-Bdynamic -lnormaleLib1 -lnormaleLib2 -o meinbinary

Damit werden die beiden seltenen Libs statisch gelinkt, die beiden normalen und die libc dynamisch.
 
Wie veraenderst du denn die Makefile, damit dort die Bibliotheken statisch drinnen sind ?

@ Mensch183
Ja so wuerde ich es auch gehen :) will nur dass das Programm auch auf anderen Rechnern laeuft ohne dass dort die Bib installiert werden muessen.

Wenn ich jedoch ein Kommando eingebe, kennt er bei mir Wl nicht und er meckert bei den Kommas rum, und mit mein meinbinary meinst du die binary die schon erstellt wurde und wird dasss eine neue die da den Namen bekommt (sry bin nicht so der Linux crack ;))
 
Zuletzt bearbeitet von einem Moderator: (Beiträge zusammengeführt.)
Mit CMake könntest das wohl in etwa so machen

Code:
project(projektname)
cmake_minimum_required(VERSION 2.8)

if(CMAKE_COMPILER_IS_GNUCXX)
  set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
endif()

if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR
    "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
    set(warnings "${CMAKE_CXX_FLAGS} -Wall -Wextra -Werror")
endif()

if (NOT CONFIGURED_ONCE)
    set(CMAKE_CXX_FLAGS "${warnings}"
        CACHE STRING "Flags used by the compiler during all build types." FORCE)
    set(CMAKE_C_FLAGS   "${warnings}"
        CACHE STRING "Flags used by the compiler during all build types." FORCE)
endif(NOT CONFIGURED_ONCE)

add_executable(${PROJECT_NAME} main.cpp) #weitere cpp Dateien hier entsprechend noch hinzufügen.
target_link_libraries(${PROJECT_NAME} lept.a tesseract.a) #wenn an den Bibliotheksnamen .a hinzugefügt wird nimmt er entsprechend die statische Variante
 
mhh ich habe ein vorgeneriertes Makefile von Netbeans bekommen und das ist total anders als deins ;D

Und meine Fehlermeldung lautet bei dem Command "gcc main.o -o -static-libgcc -Wl,-static -llept -ltesseract" = --> dass er die lin libgcc_s nicht finden kann oder dass er diese nicht oeffenen kann (sie existiert und ich habe auch rechte darauf sie zu lesen etc)

Eine andere Fehlermeldung bei dem Command " gcc main.o -o -Wl,-static -llept -ltesseract" = --> undefined reference to 'ArgumentCheck(int, char**, bool&, bool&, TimePos&, std::basic_string<char, std::char_traits<char>, std:: allocator<char> >&, ROIs&)' und undefined reference to set_ROI(TimePos, Pix*)
 
Netbeans wird wohl ein ein Makefile und keine CMakeLists.txt (diese nutzt CMake) generiert haben.
 
Eine empfehlenswerte C++ IDE für Linux ist übrigens KDevelop.
 
Zurück
Oben