C - Header // open62541



  • Hallo liebe C. Gemeinde.

    Ich arbeite gerade daran einen OPC-UA Server mit einem Client zu verbinden.

    Da ich auf dem Technischen Gymnasium gelernt habe :
    "Übersicht und Gliederung ist alles!"
    wollte ich meinen "fertigen" Client nun etwas schöner darstellen.

    Ich versuche es euch mal in der Kurzfassung zu erklären 🙂

    Also habe ich mich daran gemacht meine main-Datei (Client.c) etwas zu gliedern.

    Also alle Funktionen in eine extra Datei: Funktionen.c
    Dazu eine Header Datei : Funktionen.h
    Dann noch eine Globale Datei: Global.h

    Hierzu wird gesagt das ich OPC UA durch den Stack open62541 implementiere.

    // Global.h
    
    #include <stdio.h>
    #include <unistd.h>
    #include "open62541.h"
    
    // Funktionen.h
    
    #include "Global.h"
    
    void *NeuerClient();
    void ClientVerbindung(UA_Client *client,char URLFunktion[30]);
    UA_BrowseRequest Browsing();
    UA_BrowseResponse NodesinTabellenform(UA_Client *client,UA_BrowseRequest bReqs);
    
    //Kurzer Ausschnitt aus Funktionen.c
    #include "Funktionen.h"
    void *NeuerClient()
    {
    ..
    }
    
    //Kurzer Ausschnitt aus Client.c
    #include"Funktionen.h"
    
    int main()
    {
    ..
    }
    

    Ich benutze den Compiler gcc und den Befehl:

    gcc -std=c99 Client.c open62541.c-o Client
    

    Erhalte dann aber die Fehlermeldung:

    Client.c:(.text+0x49): Nicht definierter Verweis auf `NeuerClient'
    Client.c:(.text+0x69): Nicht definierter Verweis auf `ClientVerbindung'
    Client.c:(.text+0x87): Nicht definierter Verweis auf `Browsing'
    Client.c:(.text+0xc2): Nicht definierter Verweis auf `NodesinTabellenform'
    

    Ändere Ich in der Client.c die #include auf

    #include "Funktionen.c"
    

    😮 funkioniert alles.

    Kann mir da jemand weiterhelfen

    Grüße SBifi



  • gcc -std=c99 Client.c Funktionen.c open62541.c-o Client
    

    Edit:
    Deine Funktionen.c muss ja schließlich auch kompiliert werden. Durch obige Befehlszeile geschieht das und die entstehende Objektdatei wird mit den anderen Objektdateien, die durch Kompilierung von Client.c und open.....c entstehen, zusammengelinkt.


  • Mod

    Ein Header mit dem Namen global.h macht mir Angst. Das ist ungefähr auf dem Niveau wie ein Verschlüsselungsprogramm mit dem Namen cia_backdoor.exe .



  • Ahhhhh. Den Wald vor lauter Bäumen nicht 🙄

    natürlich! Vielen Dank.

    Ein Header mit dem Namen global.h macht mir Angst. Das ist ungefähr auf dem Niveau wie ein Verschlüsselungsprogramm mit dem Namen cia_backdoor.exe.

    Wird denke ich auch noch geändert 😉



  • Da störe ich noch einmal, 😕

    Dieser Client soll später in eine C++ Datei eingebunden werden (HMI usw..)

    C-Funktionen in C++ einzubinden sollte eigentlich kein Problem sein.
    Jedoch bin ich mir bei C99 nicht so sicher?
    Könnte mir da jemand einen Tipp geben 🙂

    Wäre es hier sinnvoll 2 Bibliotheken zu erstellen?

    *Einmal für open62541.c und open62541.h
    *Einmal für Funktionen.c und Funktionen.h

    Und versuchen es damit anzugehen?

    Grüße SeBifi



  • Ich weiß nicht, was Du meinst.
    Du kannst aber einfach mal versuchen, Deine c-Dateien von *.c nach *.cpp umzubenennen und mit einem C++ Compiler Dein Programm zu erzeugen.

    Wenn das fehlerfrei funktioniert, kannst Du in Deinen Quelldateien auch C++ verwenden, bzw. weitere Quelldateien, die C++ enthalten, Deinem Projekt hinzufügen.


  • Mod

    Belli schrieb:

    Ich weiß nicht, was Du meinst.
    Du kannst aber einfach mal versuchen, Deine c-Dateien von *.c nach *.cpp umzubenennen und mit einem C++ Compiler Dein Programm zu erzeugen.

    Wenn das fehlerfrei funktioniert, kannst Du in Deinen Quelldateien auch C++ verwenden, bzw. weitere Quelldateien, die C++ enthalten, Deinem Projekt hinzufügen.

    Ich weiß nicht, ob ich das empfehlen würde. Ich sehe auch keinen Vorteil, den du dadurch überhaupt erreichen möchtest. C sollte man schon lieber mit einem C-Compiler übersetzen. Solange die Schnittstelle im Header zu C++ kompatibel bleibt, hat man auch kein Problem, die beiden zu mischen¹. Also lieber keine Zeiger auf VLAs als Funktionsparameter benutzen.

    ¹: Die Funktion kann sogar in egal welcher Sprache geschrieben sein, solange der Aufruf selbst kompatibel bleibt.



  • Sorry das ich gestern nicht mehr geantwortet habe.

    Also ich würde gern eine Oberfläche mit wxGlade realisieren.
    Nach dem Oberflächen "basteln" besitze ich dort die Möglichkeiten mir den "Oberflächen-Code" in verschiedenen Sprachen (C++,Lisp,Perl,Python und XRC) ausgeben zu lassen.

    Bsp:

    void MyFrame::button1Klick(wxCommandEvent &event)
    {...}
    

    Nun möchte ich meine Client-Funktionen dort realisieren. Wie oben ja beschrieben habe ich dafür C (c99) verwendet.

    Nun habe ich meine H-Datei Funktionen so erweitert.
    /Bei open62541.h war es bereits implementiert/

    #ifdef __cplusplus
    extern "C" {
    #endif
    
    ..(Funktionen)
    
    #ifdef __cplusplus
    } // extern "C"
    #endif
    

    Und sie dann ganz normal in der HMI.cpp #included.

    Entweder ich hab wider einen Compiler Fehler 😕

    Compiler Code:

    g++ HMI.cpp $(wx-config --libs) $(wx-config --cxxflags) -o MyApp FunktionenHMI.c open62541.c
    

    Ich bekomme auf jedenfall sehr viele Fehlermeldungen:

    1 Bsp:

    g++ HM1.cpp $(wx-config --libs) $(wx-config --cxxflags) -o MyApp FunktionenHMI.c open62541.c
    

    Jemand ne Idee ?

    Danke schon einmal und einen schönen Karfreitag
    SeBifi



  • Ups:

    Natürlich bei Fehler

    open62541.c:4725:43: error: expected primary-expression before ‘[’ token
     const UA_DataType *UA_TYPES = (UA_DataType[])
    

  • Mod

    Übersetz jede Datei einzeln mit einem Compiler für die Sprache, in der sie geschrieben wurde.



  • SeppJ schrieb:

    Übersetz jede Datei einzeln mit einem Compiler für die Sprache, in der sie geschrieben wurde.

    Vielen Dank.
    Ich entschuldige mich jetzt schon einmal für diese Frage.
    (kommt wahrscheinlich nicht in dieses Forum)

    Wie lautet der Befehl an den GNU-Compiler?

    Leider habe ich keine Ahnung wie Ich dem GNU-Compiler sagen soll das er 1 Datei in C++ und 2 Dateien in C99 übersetzen soll. UND diese dann miteinander verlinken soll.

    Grüße SeBifi


  • Mod

    g++ HMI.cpp was_auch_immer_für_optionen_nötig_sind -c -o HMI.o
    gcc open62541.c was_auch_immer_für_optionen_nötig_sind -c -o open62541.o
    gcc FunktionenHMI.c was_auch_immer_für_optionen_nötig_sind -c -o FunktionenHMI.o
    gcc HMI.o open62541.o FunktionenHMI.o was_auch_immer_für_optionen_nötig_sind -o name_des_fertigen_programms
    

Log in to reply