[gelöst] Frage zu include (Include-Dateien aus verschiedenen Ordnern einbinden)



  • Hallo Community!

    Ich habe ein Programm, welches viele Header- und Quelldateien beinhaltet und habe deshalb diese in verschiedene Ordner sortiert. Jetzt habe ich aber ein Problem beim Einbinden dieser Header-Dateien, wenn diese nicht im selben Verzeichnis stehen wie die Datei, die diese benutzt.

    Konkreter:

    Meine Struktur sieht wiefolgt aus (nur ein Ausschnitt):

    -Projektname
    --src
    ---config
    ----config.h
    ----config.cpp
    ---logic
    ----logic.h
    ----calc.h
    ----calc.cpp
    ---include
    ----general.h
    ---main
    ----main.cpp
    

    Jetzt möchte ich in die datei main.cpp die Datei "logic.h" einbinden.
    Welchen Pfad gebe ich dann an?

    #include "../logic/logic.h"
    

    funktioniert nicht, da kommt die Meldung, dass die Datei nicht gefunden wurde. Mit dem absoluten Pfad auch nicht und nur mit

    logic.h
    

    ,

    logic/logic.h
    

    oder

    src/logic/logic.h
    

    wirds auch nichts 😞



  • Mhh, also bei mir gehts:

    dobi@dobi-Desktop:~/Desktop/Projektname$ ls -a -R
    .:
    .  ..  a.out  src
    
    ./src:
    .  ..  logic  main
    
    ./src/logic:
    .  ..  logic.h
    
    ./src/main:
    .  ..  a.out  main.cpp
    dobi@dobi-Desktop:~/Desktop/Projektname$ cat ./src/logic/logic.h 
    int i;
    
    dobi@dobi-Desktop:~/Desktop/Projektname$ cat ./src/main/main.cpp 
    #include "../logic/logic.h"
    int main() { return 0; }
    
    dobi@dobi-Desktop:~/Desktop/Projektname$ g++ ./src/main/main.cpp
    dobi@dobi-Desktop:~/Desktop/Projektname$
    

    Kommt wohl drauf an, was fürn CWD du bei deiner IDE gesetzt hast.



  • Wenn du deinem Kompiler explizit mitteilst wo die liegen (Linux: -I/ordner/wos/liegt) reicht ein einfaches #include "logic.h". Innerhalb des Projekts sollte der relative Pfad klappen.

    Ansonsten zuwenig Infos: was für ein Compiler/Betriebssystem/IDE/Makefilesystem ?



  • Mein Betriebssystem ist Linux openSUSE 11.1 x86_64.
    Ich benutze als IDE eclipse für C++ Helios Release 2

    Ich weiß aber nicht, wie eclipse kompiliert, vllt kann mir da jemand helfen, wo ich nachschauen kann, welcher Compiler benutzt wird.
    Wenn ich per Hand kompiliere (ohne Makefile, da bisher alle Dateien in einem Verzeichnis lagen), benutze ich den gcc.

    Ich habe noch nie mit make gearbeitet, weshalb ich dazu leider nichts sagen kann 😞



  • Ich schreibe mir gerade ein eigenes Makefile dazu, jetzt habe ich aber eine Frage diesbzgl.: Wird eine .o Datei von einer Klasse erstellt, die keine .c Datei enthält, sondern nur die HEader-Datei? Ich kenne mich mit den .o-Dateien nicht so wirklich aus, akcer mich aber grade durch das rekursive Make durch, welches anscheinend nötig ist, wenn man mehrere Verzeichnisse hat.

    Noch steh ich hier ein wenig auf dem Schlauch, aber mal sehen, wie es wird...



  • nein, solange du header dateien so verwendest, wie du solltest.



  • Ooookay. Also ich habe jetzt einen Verzeichnisbaum, der etwas anders ist als obiger. Den werde ich gleich mal posten mit den jeweiligen Dateien drin.

    Ich habe mir jetzt ein Makefile und module.mak-Dateien in jedem Ordner geschrieben.
    Klappt auch alles soweit ganz gut, nur beim Kompilieren tritt ein Fehler mit der boost-Bibliothek auf. Ich denke mal, dass er diese nicht finden konnte. Muss ich, wenn ich boost benutze, irgendeine lib zusötzlich angeben mit -I? Bzw. dieses in meinem Makefile hinzufügen?
    Ich habe vorher immer nur ein Verzeichnis gehabt und mit eclipse compiliert. Dort hat das Einbinden der boost-Dateien immer gut funktioniert.

    Aber jetzt kommt der Fehler:

    src/config/Configuration.o: In function `boost::archive::text_iarchive& boost::smart_cast_impl::reference<boost::archive::text_iarchive&>::polymorphic::cross::cast<boost::archive::detail::basic_iarchive>(boost::archive::detail::basic_iarchive&)':                                    
    Configuration.cpp:(.text._ZN5boost15smart_cast_impl9referenceIRNS_7archive13text_iarchiveEE11polymorphic5cross4castINS2_6detail14basic_iarchiveEEES4_RT_[boost::archive::text_iarchive& boost::smart_cast_impl::reference<boost::archive::text_iarchive&>::polymorphic::cross::cast<boost::archive::detail::basic_iarchive>(boost::archive::detail::basic_iarchive&)]+0x1b): undefined reference to `typeinfo for boost::archive::detail::basic_iarchive'                                                                                                                           
    src/config/Configuration.o: In function `boost::archive::text_oarchive& boost::smart_cast_impl::reference<boost::archive::text_oarchive&>::polymorphic::cross::cast<boost::archive::detail::basic_oarchive>(boost::archive::detail::basic_oarchive&)':                                    
    Configuration.cpp:(.text._ZN5boost15smart_cast_impl9referenceIRNS_7archive13text_oarchiveEE11polymorphic5cross4castINS2_6detail14basic_oarchiveEEES4_RT_[boost::archive::text_oarchive& boost::smart_cast_impl::reference<boost::archive::text_oarchive&>::polymorphic::cross::cast<boost::archive::detail::basic_oarchive>(boost::archive::detail::basic_oarchive&)]+0x1b): undefined reference to `typeinfo for boost::archive::detail::basic_oarchive'                                                                                                                           
    src/config/Configuration.o: In function `void boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::save<boost::archive::tracking_type>(boost::archive::tracking_type const&)':                                                                                              
    Configuration.cpp:(.text._ZN5boost7archive18text_oarchive_implINS0_13text_oarchiveEE4saveINS0_13tracking_typeEEEvRKT_[void boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::save<boost::archive::tracking_type>(boost::archive::tracking_type const&)]+0x15): undefined reference to `boost::archive::basic_text_oarchive<boost::archive::text_oarchive>::newtoken()'                                                
    src/config/Configuration.o: In function `void boost::archive::save_access::save_primitive<boost::archive::text_oarchive, boost::archive::tracking_type>(boost::archive::text_oarchive&, boost::archive::tracking_type const&)':                                                           
    Configuration.cpp:(.text._ZN5boost7archive11save_access14save_primitiveINS0_13text_oarchiveENS0_13tracking_typeEEEvRT_RKT0_[void boost::archive::save_access::save_primitive<boost::archive::text_oarchive, boost::archive::tracking_type>(boost::archive::text_oarchive&, boost::archive::tracking_type const&)]+0x15): undefined reference to `boost::archive::detail::basic_oarchive::end_preamble()'                                                                                                           
    src/config/Configuration.o: In function `void boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::save<int>(int const&)':     
    Configuration.cpp:(.text._ZN5boost7archive18text_oarchive_implINS0_13text_oarchiveEE4saveIiEEvRKT_[void boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::save<int>(int const&)]+0x15): undefined reference to `boost::archive::basic_text_oarchive<boost::archive::text_oarchive>::newtoken()'                                                                                                                       
    src/config/Configuration.o: In function `void boost::archive::save_access::save_primitive<boost::archive::text_oarchive, int>(boost::archive::text_oarchive&, int const&)':                                                                                                               
    Configuration.cpp:(.text._ZN5boost7archive11save_access14save_primitiveINS0_13text_oarchiveEiEEvRT_RKT0_[void boost::archive::save_access::save_primitive<boost::archive::text_oarchive, int>(boost::archive::text_oarchive&, int const&)]+0x15): undefined reference to `boost::archive::detail::basic_oarchive::end_preamble()'                                                                                                      
    src/config/Configuration.o: In function `boost::archive::detail::oserializer<boost::archive::text_oarchive, Uhrzeit>::~oserializer()':       
    Configuration.cpp:(.text._ZN5boost7archive6detail11oserializerINS0_13text_oarchiveE7UhrzeitED0Ev[boost::archive::detail::oserializer<boost::archive::text_oarchive, Uhrzeit>::~oserializer()]+0x1c): undefined reference to `boost::archive::detail::basic_oserializer::~basic_oserializer()'                                                                                                                                                                                                                                      
    src/config/Configuration.o: In function `boost::archive::detail::iserializer<boost::archive::text_iarchive, Uhrzeit>::~iserializer()':       
    Configuration.cpp:(.text._ZN5boost7archive6detail11iserializerINS0_13text_iarchiveE7UhrzeitED1Ev[boost::archive::detail::iserializer<boost::archive::text_iarchive, Uhrzeit>::~iserializer()]+0x1c): undefined reference to `boost::archive::detail::basic_iserializer::~basic_iserializer()'                                                                                                                                          
    src/config/Configuration.o: In function `boost::serialization::extended_type_info_typeid<Uhrzeit>::extended_type_info_typeid()':             
    Configuration.cpp:(.text._ZN5boost13serialization25extended_type_info_typeidI7UhrzeitEC1Ev[boost::serialization::extended_type_info_typeid<Uhrzeit>::extended_type_info_typeid()]+0x14): undefined reference to `boost::serialization::detail::extended_type_info_typeid_0::extended_type_info_typeid_0()'                                                                                                                             
    Configuration.cpp:(.text._ZN5boost13serialization25extended_type_info_typeidI7UhrzeitEC1Ev[boost::serialization::extended_type_info_typeid<Uhrzeit>::extended_type_info_typeid()]+0x36): undefined reference to `boost::serialization::detail::extended_type_info_typeid_0::type_register(std::type_info const&)'                                                                                                                      
    Configuration.cpp:(.text._ZN5boost13serialization25extended_type_info_typeidI7UhrzeitEC1Ev[boost::serialization::extended_type_info_typeid<Uhrzeit>::extended_type_info_typeid()]+0x6d): undefined reference to `boost::serialization::detail::extended_type_info_typeid_0::~extended_type_info_typeid_0()'                                                                                                                            
    src/config/Configuration.o: In function `boost::archive::detail::oserializer<boost::archive::text_oarchive, Uhrzeit>::oserializer()':        
    Configuration.cpp:(.text._ZN5boost7archive6detail11oserializerINS0_13text_oarchiveE7UhrzeitEC1Ev[boost::archive::detail::oserializer<boost::archive::text_oarchive, Uhrzeit>::oserializer()]+0x19): undefined reference to `boost::archive::detail::basic_oserializer::basic_oserializer(boost::serialization::extended_type_info const&)'                                                                                             
    src/config/Configuration.o: In function `boost::archive::detail::iserializer<boost::archive::text_iarchive, Uhrzeit>::iserializer()':        
    Configuration.cpp:(.text._ZN5boost7archive6detail11iserializerINS0_13text_iarchiveE7UhrzeitEC1Ev[boost::archive::detail::iserializer<boost::archive::text_iarchive, Uhrzeit>::iserializer()]+0x19): undefined reference to `boost::archive::detail::basic_iserializer::basic_iserializer(boost::serialization::extended_type_info const&)'                                                                                             
    src/config/Configuration.o: In function `boost::serialization::extended_type_info_typeid<Uhrzeit>::~extended_type_info_typeid()':            
    Configuration.cpp:(.text._ZN5boost13serialization25extended_type_info_typeidI7UhrzeitED0Ev[boost::serialization::extended_type_info_typeid<Uhrzeit>::~extended_type_info_typeid()]+0x1f): undefined reference to `boost::serialization::detail::extended_type_info_typeid_0::type_unregister()'                                                                                                                                        
    Configuration.cpp:(.text._ZN5boost13serialization25extended_type_info_typeidI7UhrzeitED0Ev[boost::serialization::extended_type_info_typeid<Uhrzeit>::~extended_type_info_typeid()]+0x41): undefined reference to `boost::serialization::detail::extended_type_info_typeid_0::~extended_type_info_typeid_0()'                                                                                                                           
    Configuration.cpp:(.text._ZN5boost13serialization25extended_type_info_typeidI7UhrzeitED0Ev[boost::serialization::extended_type_info_typeid<Uhrzeit>::~extended_type_info_typeid()]+0x91): undefined reference to `boost::serialization::detail::extended_type_info_typeid_0::~extended_type_info_typeid_0()'                                                                                                                           
    src/config/Configuration.o: In function `boost::serialization::extended_type_info_typeid<Uhrzeit>::~extended_type_info_typeid()':            
    Configuration.cpp:(.text._ZN5boost13serialization25extended_type_info_typeidI7UhrzeitED1Ev[boost::serialization::extended_type_info_typeid<Uhrzeit>::~extended_type_info_typeid()]+0x1f): undefined reference to `boost::serialization::detail::extended_type_info_typeid_0::type_unregister()'                                                                                                                                        
    Configuration.cpp:(.text._ZN5boost13serialization25extended_type_info_typeidI7UhrzeitED1Ev[boost::serialization::extended_type_info_typeid<Uhrzeit>::~extended_type_info_typeid()]+0x41): undefined reference to `boost::serialization::detail::extended_type_info_typeid_0::~extended_type_info_typeid_0()'                                                                                                                                           
    Configuration.cpp:(.text._ZN5boost7archive13text_oarchiveC1ERSoj[boost::archive::text_oarchive::text_oarchive(std::basic_ostream<char, std::char_traits<char> >&, unsigned int)]+0x1f): undefined reference to `boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::text_oarchive_impl(std::basic_ostream<char, std::char_traits<char> >&, unsigned int)'                                                               
    src/config/Configuration.o: In function `boost::archive::detail::common_oarchive<boost::archive::text_oarchive>::~common_oarchive()':        
    Configuration.cpp:(.text._ZN5boost7archive6detail15common_oarchiveINS0_13text_oarchiveEED2Ev[boost::archive::detail::common_oarchive<boost::archive::text_oarchive>::~common_oarchive()]+0x1c): undefined reference to `boost::archive::detail::basic_oarchive::~basic_oarchive()'        
    src/config/Configuration.o: In function `boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::~text_oarchive_impl()':          
    Configuration.cpp:(.text._ZN5boost7archive18text_oarchive_implINS0_13text_oarchiveEED2Ev[boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::~text_oarchive_impl()]+0x34): undefined reference to `boost::archive::basic_text_oprimitive<std::basic_ostream<char, std::char_traits<char> > >::~basic_text_oprimitive()'                                                                                                 
    Configuration.cpp:(.text._ZN5boost7archive18text_oarchive_implINS0_13text_oarchiveEED2Ev[boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::~text_oarchive_impl()]+0x5f): undefined reference to `boost::archive::basic_text_oprimitive<std::basic_ostream<char, std::char_traits<char> > >::~basic_text_oprimitive()'                                                                                                 
    src/config/Configuration.o: In function `boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::~text_oarchive_impl()':          
    Configuration.cpp:(.text._ZN5boost7archive18text_oarchive_implINS0_13text_oarchiveEED0Ev[boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::~text_oarchive_impl()]+0x34): undefined reference to `boost::archive::basic_text_oprimitive<std::basic_ostream<char, std::char_traits<char> > >::~basic_text_oprimitive()'                                                                                                 
    Configuration.cpp:(.text._ZN5boost7archive18text_oarchive_implINS0_13text_oarchiveEED0Ev[boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::~text_oarchive_impl()]+0x5f): undefined reference to `boost::archive::basic_text_oprimitive<std::basic_ostream<char, std::char_traits<char> > >::~basic_text_oprimitive()'                                                                                                 
    src/config/Configuration.o: In function `boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::~text_oarchive_impl()':          
    Configuration.cpp:(.text._ZN5boost7archive18text_oarchive_implINS0_13text_oarchiveEED1Ev[boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::~text_oarchive_impl()]+0x34): undefined reference to `boost::archive::basic_text_oprimitive<std::basic_ostream<char, std::char_traits<char> > >::~basic_text_oprimitive()'                                                                                                 
    src/config/Configuration.o:Configuration.cpp:(.text._ZN5boost7archive18text_oarchive_implINS0_13text_oarchiveEED1Ev[boost::archive::text_oarchive_impl<boost::archive::text_oarchive>::~text_oarchive_impl()]+0x5f): more undefined references to `boost::archive::basic_text_oprimitive<std::basic_ostream<char, std::char_traits<char> > >::~basic_text_oprimitive()' follow                                                         
    src/config/Configuration.o: In function `boost::archive::detail::common_oarchive<boost::archive::text_oarchive>::~common_oarchive()':        
    Configuration.cpp:(.text._ZN5boost7archive6detail15common_oarchiveINS0_13text_oarchiveEED0Ev[boost::archive::detail::common_oarchive<boost::archive::text_oarchive>::~common_oarchive()]+0x1c): undefined reference to `boost::archive::detail::basic_oarchive::~basic_oarchive()'        
    src/config/Configuration.o: In function `boost::archive::detail::common_oarchive<boost::archive::text_oarchive>::~common_oarchive()':        
    Configuration.cpp:(.text._ZN5boost7archive6detail15common_oarchiveINS0_13text_oarchiveEED1Ev[boost::archive::detail::common_oarchive<boost::archive::text_oarchive>::~common_oarchive()]+0x1c): undefined reference to `boost::archive::detail::basic_oarchive::~basic_oarchive()'        
    src/config/Configuration.o: In function `void boost::archive::save_access::save_primitive<boost::archive::text_oarchive, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >(boost::archive::text_oarchive&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':                                                                                                                     
    Configuration.cpp:(.text._ZN5boost7archive11save_access14save_primitiveINS0_13text_oarchiveESsEEvRT_RKT0_[void boost::archive::save_access::save_primitive<boost::archive::text_oarchive, std::basic_string<char, std::char_traits<char>, std::allocator<char> > >(boost::archive::text_oarchive&, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)]+0x15): undefined reference to `boost::archive::detail::basic_oarchive::end_preamble()'                                                                                                                                          
    src/config/Configuration.o:(.rodata._ZTIN5boost7archive6detail15common_iarchiveINS0_13text_iarchiveEEE[typeinfo for boost::archive::detail::common_iarchive<boost::archive::text_iarchive>]+0x18): undefined reference to `typeinfo for boost::archive::detail::basic_iarchive'
    src/config/Configuration.o:(.rodata._ZTIN5boost7archive6detail15common_oarchiveINS0_13text_oarchiveEEE[typeinfo for boost::archive::detail::common_oarchive<boost::archive::text_oarchive>]+0x18): undefined reference to `typeinfo for boost::archive::detail::basic_oarchive'
    src/config/Configuration.o:(.rodata._ZTIN5boost7archive6detail11oserializerINS0_13text_oarchiveE7UhrzeitEE[typeinfo for boost::archive::detail::oserializer<boost::archive::text_oarchive, Uhrzeit>]+0x10): undefined reference to `typeinfo for boost::archive::detail::basic_oserializer'
    src/config/Configuration.o:(.rodata._ZTIN5boost7archive6detail11iserializerINS0_13text_iarchiveE7UhrzeitEE[typeinfo for boost::archive::detail::iserializer<boost::archive::text_iarchive, Uhrzeit>]+0x10): undefined reference to `typeinfo for boost::archive::detail::basic_iserializer'
    src/config/Configuration.o:(.rodata._ZTVN5boost13serialization25extended_type_info_typeidI7UhrzeitEE[vtable for boost::serialization::extended_type_info_typeid<Uhrzeit>]+0x10): undefined reference to `boost::serialization::detail::extended_type_info_typeid_0::is_less_than(boost::serialization::extended_type_info const&) const'
    src/config/Configuration.o:(.rodata._ZTVN5boost13serialization25extended_type_info_typeidI7UhrzeitEE[vtable for boost::serialization::extended_type_info_typeid<Uhrzeit>]+0x18): undefined reference to `boost::serialization::detail::extended_type_info_typeid_0::is_equal(boost::serialization::extended_type_info const&) const'
    src/config/Configuration.o:(.rodata._ZTIN5boost13serialization25extended_type_info_typeidI7UhrzeitEE[typeinfo for boost::serialization::extended_type_info_typeid<Uhrzeit>]+0x18): undefined reference to `typeinfo for boost::serialization::detail::extended_type_info_typeid_0'
    collect2: ld returned 1 exit status
    make: *** [bin/Workminimizer.out] Error 1
    

    Dies ist nur ein Ausschnitt davon, aber die Meldungen sind sonst alle gleich.
    Ich schätze mal, dass er den Pfad nicht findet und bei jedem Aufurf dann meckert, aber vllt weiß es einer ja noch besser.

    Hier mal mein Verzeichnisbaum:

    -Workminimizer
    --bin
    --doc
    --src
    ---config
    ----Configuration.cpp
    ----Configuration.h
    ----module.mak
    ---include
    ----general.cpp
    ----general.h
    ----uhrzeit.h
    ----module.mak
    ---logik
    ----logik.cpp
    ----logik.h
    ----module.mak
    ---main
    ----main.cpp
    ----Workminimizer.cpp
    ----Workminimizer.h
    ----module.mak
    --Makefile
    

    Und hier der Code der module.mak-Dateien und des Makefiles:

    # Workminimizer/Makefile
    CC = g++
    RM = rm -rf
    
    DIRS := src/include src/config src/logik src/include src/main 
    
    CFLAGS += $(addprefix -I, $(DIRS))
    SRCS :=
    
    all: bin/Workminimizer.out
    
    include $(addsuffix /module.mak, $(DIRS))
    
    OBJS := $(addsuffix .o,$(basename $(SRCS)))
    
    bin/Workminimizer.out: $(OBJS)
    	$(CC) -o $@ $^
    
    clean:
    	$(RM) $(OBJS)
    
    # src/main/module.mak
    
    DIR := src/main/
    SRCS += $(addprefix $(DIR), Workminimizer.cpp main.cpp)
    
    $(DIR)/Workminimizer.o: $(DIR)/Workminimizer.h src/logik/logik.h src/include/general.h src/config/Configuration.h 
    $(DIR)/main.o: $(DIR)/Workminimizer.h src/config/Configuration.h
    
    # src/config/module.mak
    
    DIR := src/config
    SRCS += $(addprefix $(DIR)/,Configuration.cpp)
    
    $(DIR)/Configuration.o : src/include/uhrzeit.h $(DIR)/Configuration.h
    
    # src/include/module.mak
    
    DIR := src/include
    SRCS += $(addprefix $(DIR)/,general.cpp)
    
    $(DIR)/general.cpp: $(DIR)/general.h
    
    # src/logik/module.mak
    
    DIR:= src/logik
    SRCS += $(addprefix $(DIR)/,logik.cpp)
    
    $(DIR)/logik.o: $(DIR)/logik.h src/include/uhrzeit.h
    

    Die benötigten Header-Dateien sind schon richtig angegeben, welche jede .o-Datei braucht, also daran sollte es wohl nicht liegen.

    Ich hoffe, da kann einer mal drüberblicken und mir Vorschläge geben 🙂 Auch was die Verbesserung des Makefiles angeht, dies ist mein erstes...



  • Du musst die boost.serialization mit zu deinem Projekt linken, das ist leider keine header-only Bibliothek!

    Sprich, im bin/Workminimizer.out target fehlen dir die -l und -L parameter für ld



  • Also meine boost-library liegt in /usr/include/boost

    Wie ist dann der Pfad, den ich angeben muss? -Iboost oder -Iinclude/boost oder wie? und wozu das -L was muss dort hin?



  • Fabulus schrieb:

    Also meine boost-library liegt in /usr/include/boost

    Wie ist dann der Pfad, den ich angeben muss? -Iboost oder -Iinclude/boost oder wie? und wozu das -L was muss dort hin?

    -I ist für den Compiler und sagt, wo er include-Dateien suchen soll. das was du oben hast sind also die Informationen für die Header, die eingebunden werden, für den Compiler.
    -l (kleines L) ist für den Linker und sagt ihm, welche Bibliotheken er zu deinen Objektdateien dazulinken muss, damit alle Definitionen für die fertige Anwendung gefunden werden können.
    -L ist auch für den Linker und sagt ihm, wo er die Bibliotheken suchen soll. Vermutlich irgendwas mit lib/boost

    Steht aber auch im Manual für deinen gcc mit drin.
    Wenn du dich (lobenswerter Weise) mit den etwas komplexeren Build-Aufgaben beschäftigst und nicht mehr alles von einer IDE zusammenbasteln lässt, solltest du sowas auf jeden Fall kennen. Beschäftige dich mal mit den verschiedenen Phasen der Programmerstellung, z.B. hier:

    http://library.thinkquest.org/C001341/tuts/opentut.php3?id=21&mn=d&page=1&pn=t



  • Ok, ich hoffe, ich habe es so jetzt richtig verstanden:

    Der Präprozessor ersetzt alle include-Anweisungen durch den Code dieser inkludierten Header-Dateien. Dann wird aus den angegeben Source-Files Objektdateien erstellt.
    Der Linker fügt diese erstellten Objektdateien dann zusammen. Da aber nicht alle Bibliotheken im gleichen Ordner sind, muss erst mit -l angegeben werden, welche man braucht und mit -L der Ort, wo diese zu finden sind.

    Das -I ist nur der Pfad zu den zu inkludierenden Dateien, und hat mit boost also eher wenig zu tun.

    Da ich die "boost"-Bilbiothek linken moechte, müsste ich hiermit dem Aufruf ein

    -lboost
    

    und als Verzeichnis

    -L/usr/lib64
    

    (Die boost-Dateien befinden sich in /usr/lib64)

    Meine Make-Datei sieht bisweilen so aus:

    # Workminimizer/Makefile
    CC = g++
    RM = rm -rf
    
    DIRS := src/include src/config src/logik src/include src/main 
    LIBS := /usr/lib64
    
    CFLAGS += $(addprefix -I, $(DIRS))
    CLIBS += $(addprefix -L, $(LIBS))
    SRCS :=
    
    all: bin/Workminimizer.out
    
    include $(addsuffix /module.mak, $(DIRS))
    
    OBJS := $(addsuffix .o,$(basename $(SRCS)))
    
    bin/Workminimizer.out: $(OBJS)
    	$(CC) -o $@ $^ $(CLIBS)
    
    clean:
    	$(RM) $(OBJS)
    

    Ich weiß einfach nicht, welchen Pfad ich dort angeben muss. Die Theorie kenne ich jetzt, aber praktisch hab ich noch nich so den Durchblick.

    Edit:

    Ich benutze übrigens boost/archive/text_oarchive.hpp und boost/archive/text_iarchive.hpp und habe auch mit -lboost_archive keinen Erfolg erzielen können.



  • Fabulus schrieb:

    Ok, ich hoffe, ich habe es so jetzt richtig verstanden:

    Der Präprozessor ersetzt alle include-Anweisungen durch den Code dieser inkludierten Header-Dateien.

    Richtig. Die Header sucht er in den include-Pfaden. Da gibts ein paar standard-Pfade, und mit -I kannst du noch weitere Pfade angeben.

    Dann wird aus den angegeben Source-Files Objektdateien erstellt.
    Der Linker fügt diese erstellten Objektdateien dann zusammen.

    Die Objektdateien und die mit -l angegebenen Bibliotheken!

    Da aber nicht alle Bibliotheken im gleichen Ordner sind, muss erst mit -l angegeben werden,

    das -l hat nichts damit zu tun ob sie im gleichen Ordner liegen oder nicht. Wenn du sie mit linken möchtest, musst du sie angeben, genau wie die Objektdateien.

    und mit -L der Ort, wo diese zu finden sind.

    Richtig.

    Das -I ist nur der Pfad zu den zu inkludierenden Dateien, und hat mit boost also eher wenig zu tun.

    Doch, hat es. Zu jeder Bibliothek gibts auch immer Header, in denen die Funktionen deklariert sind, die die Bibliothek bereitstellt. Genauso wie du in A.hpp deklarierst, welche Funktionen in A.cpp und damit später in A.o liegen. Deshalb musst du auch angeben, wo die boost-header liegen, die du mit #include einbindest.

    Da ich die "boost"-Bilbiothek linken moechte, müsste ich hiermit dem Aufruf ein

    -lboost
    

    und als Verzeichnis

    -L/usr/lib64
    

    (Die boost-Dateien befinden sich in /usr/lib64)

    Dann schau dort doch mal ob die wirklich boost.lib heißt. Bezweifle ich nämlich. Bei mir haben die Namen wie libboost_serialization-mt-s.lib und libboost_serialization-sgd.lib
    Es sollte aber auch in der Doku auf der Boost Homepage zu finden sein wie die heißen und welche davon die richtige für dich ist (mit/ohne Debuginformationen und Optimierungen gebaut usw.)

    Meine Make-Datei sieht bisweilen so aus:

    ...
    

    da steht nirgendwo das -l

    Ich benutze übrigens boost/archive/text_oarchive.hpp und boost/archive/text_iarchive.hpp und habe auch mit -lboost_archive keinen Erfolg erzielen können.

    Weil es keine boost_archive.lib gibt.



  • Langsam werd ich daraus auch schlauer 🙂

    Also das Verzeichnis, in dem die libs liegen, ist /usr/lib64
    Die Dateien in diesem Ordner heissen libboost_serialization-mt.so und libboost_serialization.so (welche beide nach libboost_serialization.so.1.36.0 linken).

    Demnach müsste es dann doch mit folgendem funktionieren:

    # Workminimizer/Makefile
    CC = g++
    RM = rm -rf
    
    DIRS := src/include src/config src/logik src/include src/main 
    
    # Habe es hier auch mit dem direkten Namen libboost_serialization.so.1.36.0 versucht
    LIBS := libboost_serialization.so 
    LIBDIR := /usr/lib64/
    
    CFLAGS += $(addprefix -I, $(DIRS))
    CLIBS += $(addprefix -l, $(LIBS))
    CLIBDIR += $(addprefix -L, $(LIBDIR))
    SRCS :=
    
    all: bin/Workminimizer.out
    
    include $(addsuffix /module.mak, $(DIRS))
    
    OBJS := $(addsuffix .o,$(basename $(SRCS)))
    
    bin/Workminimizer.out: $(OBJS)
    	$(CC) -o $@ $^ $(CLIBDIR) $(CLIBS)
    

    also mit -L gebe ich den absoluten Pfad /usr/lib64 an und mit -l den Namen der lib, die ich benutzen will.

    Ist es so denn im Grunde richtig?

    Die Fehlermeldung ist jetzt nämlich beim make-Aufruf:

    g++ -o bin/Workminimizer.out src/include/general.o src/config/Configuration.o src/logik/logik.o src/main/Workminimizer.o src/main/main.o -L/usr/lib64/ -llibboost_serialization.so
    /usr/lib64/gcc/x86_64-suse-linux/4.3/../../../../x86_64-suse-linux/bin/ld: cannot find -llibboost_serialization.so
    collect2: ld returned 1 exit status
    make: *** [bin/Workminimizer.out] Error 1
    

    Irgendwas stimmt ja immer noch nicht..



  • Weil der Linker nur den Namen der lib braucht, und nicht den Dateinamen.
    -lboost_serialization soll rauskommen.
    das "lib" vorne und das ".so" hinten will der Linker nicht haben 😛



  • Ah, jetzt funktioniert es! Danke sehr an alle, die mir hier geholfen haben 🙂


Anmelden zum Antworten