Extern C korrekt kompilieren für user



  • Hallo,

    ich habe eine Anwendung in C++ die gegen eine Bibliothek linkt die in C geschrieben ist. Mit dem Linken klappt alles wunderbar. Zusätzlich binden meine
    Sourcen eine header-datei ein die nur aus einem

    extern "C"
    {
        #include "../<bib ordner>/Include/<datei>.h"
    }
    

    besteht. Jetzt frage ich mich aber wenn der user die bib ganz wo anders hat liegt auch die Datei <datei>.h mit dem Ordner wo anders. Und ich will jetzt nicht dass jeder User extra immer diese headerdatei anpassen muss damit er <datei>.h findet.

    Wie macht man es denn normalerweise? Gibt es dafür eine passende Lösung?

    Danke 🙂



  • Warum soll ein USER Deine Anwendung neu übersetzen?



  • Wenn der User die Datei.h einfach woanders hinschiebt sollte das aber nicht dein Problem sein. Wie will man das verhindern? Was ist wenn er sie löscht?
    Der muss sich an die Struktur halten, wenn nicht, sein Problem.



  • Danke euch für eure Antworten.

    Es ist etwas anders: Die Bibliothek liefere ich mit meiner Anwendung NICHT aus. Das heißt der user muss sich die Bib erst runterladen und dann kompilieren. Er kann den Ordner mit der gesamten Bibliothek ganz wo anders haben und in dem ordner liegt dann auch das file <datei>.h drin.

    Geht das irgendwie ohne das der User das file ändern muss und neu kompilieren muss?



  • Änder die Anweisung in #include "<datei>.h"
    Mal ne Frage: Ist das ein Windows-System? Da sind doch < und > im Dateinamen gar nicht erlaubt?

    Dann soll der User sich seine Headerdateien hinlegen, wo er will, und muß dann dem Compiler über entsprechende Optionen die Verzeichnisse mitteilen, wo nach Header-Dateien gesucht werden soll.

    Oder aber noch einfacher: Er legt sich die Datei in das Verzeichnis mit den anderen Source-Dateien, die kompiliert werden müssen.



  • Üblicherweise findet man sowas in C-Bibliotheken:

    #ifdef __cplusplus // bin mir grad nicht 100% sicher bezüglich des namens
    extern "C" {
    #endif
    
    /* rest des headers */
    
    #ifdef __cplusplus
    } // extern "C"
    #endif
    

    Dann muss der User garnichts machen und ein C-Compiler ignoriert extern "C" einfach.



  • Erstmal danke für die Hilfe.

    Änder die Anweisung in #include "<datei>.h"
    Mal ne Frage: Ist das ein Windows-System? Da sind doch < und > im Dateinamen gar nicht erlaubt?

    Dann soll der User sich seine Headerdateien hinlegen, wo er will, und muß dann dem Compiler über entsprechende Optionen die Verzeichnisse mitteilen, wo nach Header-Dateien gesucht werden soll.

    Habe ich das jetzt richtig vertstanden dass ich einfach meine Headerdatei (die von meinen anderen sourcen eingebunden wird) so schreiben sollte:

    extern "C"
    {
        #include "<datei>.h"
    }
    

    (Ich befinde mich tatsächlich auf einem Linuxsystem.)

    Wie teile ich (bzw.der User) dann dem Compiler mit wo das file "<datei>.h" denn liegt? So muss der user aber dann das Makefile ändern (oder die Konfig-datei welche das makefile erstellt) oder?

    Habe ich das so richtig verstanden?

    Danke



  • Du solltest das extern "C" so wie gezeigt direkt in "<datei.h>" einfügen.

    Der User teilt dem Compiler mit, wo Include-Dateien liegen, indem er den Parameter -I angibt. So wie bei "normalen" Bibliotheken auch.



  • Jetzt verstehe ich was du meinst. Allerdings liegt da folgendes Problem: Die Datei <datei.h> ist in einer Bibliothek die ich mit meiner Anwendung nicht mitliefere. Der user muss sich die Bib erst downloaden. Somit bringt es nix das file <datei.h> zu editieren.

    Gäbe es vielleicht doch noch eine Möglichkeit sinnvoller zu gestalten als wie ich bisher...?

    Oder habe ich immer noch was falsch verstanden?



  • *push*



  • Fragö schrieb:

    Gäbe es vielleicht doch noch eine Möglichkeit sinnvoller zu gestalten als wie ich bisher...?

    Wenn ich alles richtig verstanden habe, dann: Nein.

    Wenn ein User sich Dateien besorgt, die er zur Erstellung einer Anwendung benötigt, dann hast Du als Download-Anbieter keinen Einfluß darauf, wie er die Dateien auf seiner Platte verteilt.
    Er könnte jede Datei in ein anderes Verzeichnis speichern.
    Darauf kann man sich nicht generell vorbereiten.

    Ich würde wie gesagt erst mal davon ausgehen, daß alle Dateien, die zur Programmerstellung benötigt werden, in einem Verzeichnis liegen (ausgenommen Dateien, die zur Entwicklungsumgebung gehören, wie string, vector usw.).
    Dann brauchst Du in Deiner #include - Anweisung keine Pfadangabe, sondern nur den Dateinamen.
    Sollte es aus Gründen der Komplexität der Anwendung geboten sein, die Quell/Headerdateien in verschiedenen Verzeichnissen zu verwalten, kannst Du im MakeFile eine Variable auf das oberste Verzeichnis setzen, unter dem dann die bekannte vorgegebene Struktur erwartet wird.
    Der User muß dann diese Variable auf das passende Verzeichnis setzen.

    Aber ganz ohne User-Zutun wirst Du das sonst kaum lösen können.


Anmelden zum Antworten