Makefile - Dynamisch



  • Ahoi,

    ich habe Probleme mit meinem Makefile und glaube, dass es "dynamisch" sein muss.

    Wenn ich das Programm aus Eclipse starte funktioniert alles.
    Aber wenn ich mich über die Console auf einem anderen Pc anmelde und aus einem über geordneten Ordner das Programm (Mesh2Starcast) starten möchte gibt es einen Fehler.

    ich schreibe also in der Konsole:

    programm/./Mesh2STARCAST joern.unv
    (joern.unv ist ein Argument für das Programm)

    Dann kommt die Fehlermeldung:

    programm/./Mesh2STARCAST: error while loading shared libraries: libboost_iostreams.so.1.33.1: cannot open shared object file: No such file or directory

    Wenn ich dann in den Ordner Programm gehe, ./MAkE tipppe, wieder zurück gehe und wieder starte läuft das Programm aber durch.
    Das wundert mich, weil es ja eigentlich schon Compiliert ist oder?

    mein Makefile sieht so aus:

    CC = g++
    LIBS = -lboost_iostreams
    
    all:
    	$(CC) -I. -c *.cpp      -L/usr/lib/debug/usr/lib64
    	$(CC) -o Mesh2CASTS *.o $(LIBS)
    	$(CC) -o Mesh2HOMAT *.o $(LIBS)
    	$(CC) -o Mesh2STARCAST *.o $(LIBS)
    debug:
    	$(CC) -I. -g -DDEBUG -c *.cpp -L/usr/lib/debug/usr/lib64 -static
    	$(CC) -o Mesh2CASTS *.o $(LIBS)
    	$(CC) -o Mesh2HOMAT *.o $(LIBS)
    	$(CC) -o Mesh2STARCAST *.o $(LIBS)
    

    p.s.

    ich sollte noch ergänzen, falls es nciht sowieso schon auffällt, dass ich sehr wenig Ahnung von Makefiles habe ^^....

    Gruß Tim



  • Schon mal ueber die Fehlermeldung Gedanken gemacht? LD_LIBRARY_PATH setzen oder aehnliches, damit die Bibliothek gefunden werden kann. Oder aber Boost dynamisch compilieren, oder ... oder ... oder ...



  • Probier es mal mit

    LD_LIBRARY_PATH=/usr/lib/debug/usr/lib64 programm/./Mesh2STARCAST joern.unv
    

    wenn /usr/lib/debug/usr/lib64 ein Standard-Library-Pfad ist, dann solltest du ihn vielleicht in deine ld.conf schreiben.



  • Sorry aber ich versteh nur Bahnhof...
    Ich würd es ja gerne so schon verstehen aber ich brauche leider genaue Anweiseungen.

    Oder aber Boost dynamisch compilieren

    Das möchte ich machen, wie funktioniert das?

    Gruß



  • Rustyspoon schrieb:

    Sorry aber ich versteh nur Bahnhof...

    Wenn du eine dynamische Bibliothek linkst, dann wird diese ja erst geladen wenn das Programm geladen wird. Das ganze macht der dynamische Linker. Der muss aber wissen wo die Library ist und er sucht eben in Standard-Pfaden nach (zB /usr/lib). Aber libboost_iostreams.so.1.33.1 (übrigens ist Boost 1.45 aktuell!) liegt offenbar nicht in einem Standard-Pfad. Also findet der dynamische Linker die Bibliothek nicht. Mit der Umgebungsvariable LD_LIBRARY_PATH kannst du aber zusätzliche Pfade angeben in denen der dynamische Linker dann suchst.

    Das ist das ganze Problem. Probier daher einfach mal aus, was ich dir vorgeschlagen habe.

    (Deine Makefile ist übrigens nicht sonderlich gut. Aber das ist ein anderes Thema)



  • Ehhh ja,

    ich hab das Makefile nicht mal selber geschrieben.

    Wenn ich das Programm von mir aus starte funktioniert es ja auch.

    Desshalb war der Plan, es bei mir zu compilieren und dabei die Libary mit in die ausführbare Datei Mesh2Starcast einzubinden. Das hat soweit ich mich erinnere auch schonmal funktioniert. Ich dachte das wäre das dynamische einbinden.
    Wie gesagt, ich hab 0 Ahnung von dem ganzen, ich will einfach nur, dass es funktioniert 😣

    Ich glaube nicht, dass die zusätzlichen Pfade helfen, denn eventuell sind die benötigten Libarys ja garnicht auf dem Pc, desshalb wäre es optimal, wenn ich die direkt beim Compilieren von meinem Pc irgendwie mit einbinde, falls das geht?

    Gruß



  • das geht wenn du es statisch kompilierst (so wie bei deinem make debug). Dafür brauchst du die statische Variante der Bibliothek (Endung .a).



  • Ja aber warum funzt es dann nicht.

    Wenn ich das Programm bei mir unter Eclipse durchlaufen lasse kommt am anfang:

    make debug
    g++ -I. -g -DDEBUG -c *.cpp -L/usr/lib/debug/usr/lib64 -static

    und es startet, wenn ich jetzt die Mesh2Starcast exe in den "Programm" Ordner schiebe und dann wieder in der Console, wo ich ja unter einem anderen Benutzer bin:
    programm/./Mesh2STARCAST joern.unv

    eintippe. Kommt trotzdem in der Console der Fehler:

    programm/./Mesh2STARCAST: error while loading shared libraries: libboost_iostreams.so.1.36.0: cannot open shared object file: No such file or directory

    Irgendwas mache ich also noch falsch oder verstehe es nicht.



  • -static musst du beim linken angeben. (Du hast es also genau in der falschen Zeile)



  • ehh wo genau ist das linken?^^...

    ich habs jetzt erstmal unter all geschrieben, dann machts keinen unterschied, also hab ichs mal hinter die zeile wo starcast steht geschrieben also:

    all:
    	$(CC) -I. -c *.cpp      -L/usr/lib/debug/usr/lib64 
    	$(CC) -o Mesh2CASTS *.o $(LIBS) 
    	$(CC) -o Mesh2HOMAT *.o $(LIBS)
    	$(CC) -o Mesh2STARCAST *.o $(LIBS) -static
    

    jetzt kommt beim starten allerdings schon bei Eclipse ein Fehler.

    **** Build of configuration Debug for project mesh2homat ****
    
    make debug 
    g++ -I. -g -DDEBUG -c *.cpp -L/usr/lib/debug/usr/lib64
    g++ -o Mesh2CASTS *.o -lboost_iostreams
    g++ -o Mesh2HOMAT *.o -lboost_iostreams
    g++ -o Mesh2STARCAST *.o -lboost_iostreams -static
    /usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../lib64/libboost_iostreams.a(zlib.o): In function `boost::iostreams::detail::zlib_base::after(char const*&, char*&, bool)':
    /usr/src/packages/BUILD/boost_1_36_0/libs/iostreams/src/zlib.cpp:123: undefined reference to `crc32'
    /usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../lib64/libboost_iostreams.a(zlib.o): In function `boost::iostreams::detail::zlib_base::do_init(boost::iostreams::zlib_params const&, bool, void* (*)(void*, unsigned int, unsigned int), void (*)(void*, void*), void*)':
    /usr/src/packages/BUILD/boost_1_36_0/libs/iostreams/src/zlib.cpp:184: undefined reference to `inflateInit2_'
    /usr/src/packages/BUILD/boost_1_36_0/libs/iostreams/src/zlib.cpp:184: undefined reference to `deflateInit2_'
    /usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../lib64/libboost_iostreams.a(zlib.o): In function `boost::iostreams::detail::zlib_base::reset(bool, bool)':
    /usr/src/packages/BUILD/boost_1_36_0/libs/iostreams/src/zlib.cpp:150: undefined reference to `deflateReset'
    /usr/src/packages/BUILD/boost_1_36_0/libs/iostreams/src/zlib.cpp:150: undefined reference to `inflateEnd'
    /usr/src/packages/BUILD/boost_1_36_0/libs/iostreams/src/zlib.cpp:150: undefined reference to `inflateReset'
    /usr/src/packages/BUILD/boost_1_36_0/libs/iostreams/src/zlib.cpp:150: undefined reference to `deflateEnd'
    /usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../lib64/libboost_iostreams.a(zlib.o): In function `boost::iostreams::detail::zlib_base::inflate(int)':
    /usr/src/packages/BUILD/boost_1_36_0/libs/iostreams/src/zlib.cpp:138: undefined reference to `inflate'
    /usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../lib64/libboost_iostreams.a(zlib.o): In function `boost::iostreams::detail::zlib_base::deflate(int)':
    /usr/src/packages/BUILD/boost_1_36_0/libs/iostreams/src/zlib.cpp:133: undefined reference to `deflate'
    collect2: ld returned 1 exit status
    make: *** [debug] Fehler 1
    

Anmelden zum Antworten