"Alte" C-Funktionen in C++Builder aufrufen..



  • Ich habe ein altes Projekt mit vielen *.c Files. Jetzt möchte ich dieses
    Projekt in Borland C++Builder weiter entwickeln. Ich kann die *.c Files in
    C++Builder einbinden. Nach dem Start werden auch dies Files kompiliert und
    daraus entstehen *.obj.
    Wie kann ich die C-Funktionen ansprechen? Umwandlung in von *.c in *.cpp und danach Kompilieren kommt nicht in Frage wegen sehr vieler Fehler.



  • "Umwandeln" in cpp-Dateien ist ja auch relativ unsinnig. 🙂

    Hast du zu den c-Dateien denn keine Header-Dateien (mit Prototypen), die du dann überall einbinden (#include) kannst, wo sie gebraucht werden?



  • _matze schrieb:

    "Umwandeln" in cpp-Dateien ist ja auch relativ unsinnig. 🙂

    Hast du zu den c-Dateien denn keine Header-Dateien (mit Prototypen), die du dann überall einbinden (#include) kannst, wo sie gebraucht werden?

    Alle Header Dateien habe in das Projektverzeichnis von C++Builder kopiert.
    Die Dateien werden gefunden und die Bildung von *.obj von *.c läuft fehlerfrei.



  • Dann soltest du in einer Code-Datei, in der du den passenden Header mit dem passenden Prototypen eingebunden hast, doch eigentlich problemlos auch diese Funktion aufrufen können, oder? Was genau klappt denn dabei nicht?



  • Beim Enbinden der Headerdateien deiner c-Funktionen in C++ Dateien müssen diese in einen extern c Block eingeschlossen werden. So etwa:

    extern "C"
    {
      #include "c_datei.h"
    }
    


  • _matze schrieb:

    Dann soltest du in einer Code-Datei, in der du den passenden Header mit dem passenden Prototypen eingebunden hast, doch eigentlich problemlos auch diese Funktion aufrufen können, oder? Was genau klappt denn dabei nicht?

    Beispiel Funktion in diff.c:
    int diff(int x, int y)
    {
    return (x-y) ;
    }

    Beispiel in C++Builder:

    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 Form1;
    int diff(int x,int y);
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent
    Owner)
    : TForm(Owner)
    {
    int Ergebnis;

    Ergebnis = diff(10,2);
    }
    //------------------------------
    Nach dem Start die Meldung:
    [Linker Fehler] Unresolved external 'diff(int, int)' referenced from C:\PROGRAMME\BORLAND\CBUILDER6\PROJECTS\C_PROJECT\UNIT1.OBJ
    Mit Compilier Modus: C++ Compilierung erzwingen, läuft die Sache fehlerfrei.



  • Braunstein schrieb:

    Beim Enbinden der Headerdateien deiner c-Funktionen in C++ Dateien müssen diese in einen extern c Block eingeschlossen werden. So etwa:

    extern "C"
    {
      #include "c_datei.h"
    }
    

    Danke!

    nach der Änderung:

    TForm1 Form1;
    extern "C"
    {
    int diff(int x,int y);
    }
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent
    Owner)

    funkt das auch! Also: extern "C"...



  • Hallo,
    habe das gleiche Problem:
    [Linker Fehler] Unresolved external 'Cfunktion()' referenced from C:\PROGRAMME\BORLAND\CBUILDER5\PROJECTS\OBJ\UNIT1.OBJ

    Habe die oben genannte Lösung angewandt:

    //C++ Datei
    
    #include <vcl.h>
    #include "mainunit.h"
    
    extern "C"
    {
     #include "C-Datei.h"
    }
    
    #pragma hdrstop
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    Tmain *main;
    
    extern "C" void C-Funktion();
    .
    .
    .
    void __fastcall Tmain::Button1Click(TObject *Sender)
    {
     C-Funktion();     
    }
    

    Die C-Datei habe ich über Menü->Projekt->Dem Projekt hinzufügen eingebunden und nicht verändert.

    Nun weiß ich nicht was ich falsch gemacht habe, der Compiler läuft durch aber der Linker nicht.

    Bin für jeden Hinweis dankbar!

    gruß grabs



  • Lass bitte diese Zeile hier weg.

    extern "C" void C-Funktion();
    

    Die Deklaration der Funktion wird doch schon im eingebundenen Header vorgenommen.



  • danke für die Hilfe, funktioniert jetzt!

    gruß crabs


Anmelden zum Antworten