Header Only Lib bauen und einbinden



  • Hallo,
    ich möchte folgende Lib benutzen:
    Lib.
    Die kann man als "Header-Only" bauen. Das habe ich dann in der Virtuellen Maschine (ubuntu) gemacht. Diese Dateien (nur bestehend aus Headern), habe ich dann auf mein Windows System kopiert.
    Ich habe ein Projekt mit Qt (mscv2015x64) angelegt und die Lib in den Workspace getan und in der".pro" datei inkludiert.
    Die Lib ist abhängig von einer weiteren Lib (Armadillo) Diese habe ich ebenfalls als Header Lib in das Verzeichnis gelegt und in der pro inkludiert.
    Das angelegte Projekt enthält 1 zu 1 den Example Code Lib.
    Das Problem ist, laut Anleitung muss man den Pfad zur Armadillo Lib angeben (zumindest beim normalen bauen). Bei der Header Only steht nichts dazu.
    Ebenfalls habe ich folgendes in einer Header Datei (optim_options) gefunden.

    #ifdef USE_RCPP_ARMADILLO
        #include <RcppArmadillo.h>
    #else
        #ifndef ARMA_DONT_USE_WRAPPER
            #define ARMA_DONT_USE_WRAPPER
        #endif
        #include "armadillo"
    #endif
    

    Sollte das dann nicht funktionieren,wenn die beiden Libs im selben Workspace liegen?

    Dann habe ich zum Test in jede Header der Lib die Armadillo lib inkludiert. Im ersten Moment schien das zu funktionieren, dann gab es aber andere Fehler. "error: C2039: 'function': is not a member of 'std'"
    Dieses habe ich weg bekommen, durch include <functional> , jedoch sind dann Fehler in der functional selbst aufgetreten.

    Nun weiß ich nicht weiter. Ist es überhaupt möglich die Lib auf Windwos mit meinen Bedingungen zu nutzen?

    Wir wird in einer solchen Header Only Lib eine weitere Header Only Lib inkludiert (würde das sonst in den headern anpassen) ?

    Also wie sage ich der opmLib, wo Arma liegt ?

    Hat jemand eine Idee, wie man diese Lib ans laufen bekommt?



  • Bei Headern mußt du die Headerpfade entsprechend setzen (per /I bzw. in der Qt ".pro"-Datei mittels INCLUDEPATH).
    Wenn aber der Header "armadillo" im selben Verzeichnis wie die aufrufende Headerdatei ("optim_options") ist, dann sollte es auch direkt so funktionieren.



  • Also ich habe ein Arbeitsverzeichnis:
    Sieht dann so aus - Ordernsrtuktur
    programm: - optimLib/optim.hpp
    -armadillo9.900.2/armadillo.hpp

    Also die Libs sind in dem Arbeitsverzeichnis nochmal in eigenen Ordnern



  • Dann setze doch einfach den INCLUDEPATH auf das Verzeichnis armadillo9.900.2.

    PS. Beachte, daß in dem Code von oben die eingebundene Headerdatei "armadillo" (ohne .hpp) lautet.



  • Genau also die beiden Libs habe ich wie folgt in der .pro meines Projekts

    QT -= gui
    
    CONFIG += c++11 console
    CONFIG -= app_bundle
    
    DEFINES += QT_DEPRECATED_WARNINGS
    
    
    SOURCES += \
            main.cpp
    
    INCLUDEPATH +=  optimlib \
                    armadillo-9.900.2/include
    
    
    # Default rules for deployment.
    qnx: target.path = /tmp/$${TARGET}/bin
    else: unix:!android: target.path = /opt/$${TARGET}/bin
    !isEmpty(target.path): INSTALLS += target
    

    Somit habe ich beide Libs zu meiner Software hinzugefügt, also ich kann die beiden da nutzen.
    Nur ist ja immer noch die Optim von Arma abhängig, das ist ja darüber nicht geregelt ?!
    Ich muss der Optim ja irgendwie ansagen wo die Arma liegt. Muss ich dann da nich die Header anpassen ?



  • So sollte es jetzt funktionieren. Erhältst du noch Fehlermeldungen?



  • Beim bauen:
    Dann erscheinen über 100 Fehler. Also in einem Header und einer und gleichnamigen "ipp" der Lib (error_reporting.hpp/ipp).
    test\optimlib\misc\error_reporting.hpp:28: error: C2039: 'function': is not a member of 'std'
    test\optimlib\misc\error_reporting.hpp:28: error: C2061: syntax error: identifier 'function'
    test\optimlib\misc\error_reporting.hpp:31: error: C2039: 'function': is not a member of 'std'
    test\optimlib\misc\error_reporting.hpp:31: error: C2061: syntax error: identifier 'function'
    test\optimlib\misc\error_reporting.ipp:35: error: C2065: 'err_tol': undeclared identifier
    test\optimlib\misc\error_reporting.ipp:35: error: C2065: 'iter': undeclared identifier

    usw usw.



  • Wenn ich das richtig sehe, dann bindet die OptimLib überhaupt keine der Standard-C++ Header ein (und vertraut wohl darauf, daß diese über "armadillo" richtig eingebunden werden - very strange!).

    Binde mal selber vor dem #include "optim.hpp" noch die fehlenden Header ein:

    #include <functional>
    #include <iostream>
    // ...
    
    #include "optim.hpp"
    

    Edit: Ich habe gerade in den Source von armadillo geschaut. Anscheinend wird <functional> erst mit dem Makro ARMA_USE_CXX11 eingebunden (obwohl der Header schon vor C++11 verfügbar war): müßtest dieses Makro also in den DEFINES noch hinzufügen.

    Dann wundert es mich um so mehr, daß die OptimLib dieses Makro nicht selber setzt, wenn es laut Beschreibung sowieso nur C++11 verwendet:

    OptimLib
    A C++11 library of local and global optimization algorithms, as well as root finding techniques.



  • Alles klar, habe alle fehlenden std libs inkludiert. Es geht!
    Vielen lieben Dank Th69, du hast mir meinen Studentenarsch gerettet 😃 und mir viel Zeit erspart


Log in to reply