C Code in C++ Projekt



  • Hey,
    ich soll im Rahmen meiner Studienarbeit ein Modellierungsprogramm (das mir C Code ausspuckt) in ein Simulationsprogramm (C++ Projekt) integrieren. Dabei hab' ich versucht eben den C Code (ohne main) einfach in das C++ File zu includen und dann Funktionen daraus aufzurufen. Allerdings scheint er meine Vermischung von C und C++ Code nicht zu vertragen, weil er beim Linken manche Funktionen plötzlich nicht mehr in die miteingebundene lib referenziert bekommt (error LNK2001: Nichtaufgeloestes externes Symbol "void __cdecl amatDel(struct Amatrix *)" (?amatDel@@YAXPAUAmatrix@@@Z))und ansonsten viele Fehler (error LNK2001: Nichtaufgeloestes externes Symbol "void __cdecl terminating_(long *)" (?terminating_@@YAXPAJ@Z)) bringt. By the way, ich benutz das Visual Studio.
    Könnt ihr mir vielleicht weiterhelfen was denn die prinzipielle Schwierigkeit an der Mischung des Codes ist und wo eventuell Probleme auftreten können?? Ich hab' schon versucht den kompletten Code als extern "C" {} einzubinden, nur leider bringt er mir dann Fehler bei der Einbindung von Standardheadern (math.h).
    Wäre cool, wenn jemand Licht in mein Dunkel bringen könnte.

    Gruß Minuli



  • Hast du mal versucht, nur deinen C-Header in extern "C"{...} einzuschließen? (die normalen C++ Teile brauchen sowieso keine extern-Kennung und die C-Bibliothek sollte normalerweise selber angepasst sein)

    PS: Und vielleicht hilft es ja, den extern-Block mit bedingter Compilierung von dem C-Compiler zu verbergen:

    #ifdef __cplusplus
    extern "C" {
    #endif
      ....
    #ifdef __cplusplus
    }
    #endif
    


  • extern "C" {} ist aber schon die richtige Lösung im Prinzip.
    Der Rest ist halt gefriemel.
    Am besten mit extern "C" {} die Header-Dateien des C-Codes einbinden (innerhalb der aufrufenden .cpp-Dateien).
    Die .c-Dateien dann ganz normal zu deinem Projekt hinzufügen.



  • Danke für eure Antworten!! Das Problem ist eben, dass ich circa 16000 Zeilen C Code include, woraus ich dann Funktionen aufruf. D.h. ich include nicht einfach einen Header (weil ich keinen hab') sondern einfach den kompletten Code des Modellierungsprogramms. Nur werden in dem C Code dann weitere Standardheader hinzugezogen, die sich aber scheinbar nicht als C Header linken lassen. Gibts denn auch eine Möglichkeit einen Header/CFile explizit als C++ einzubinden?? Dann könnte ich die Standardfiles aus der C Bindung rausnehmen.



  • Minuli schrieb:

    ...ich include nicht einfach einen Header (weil ich keinen hab')...

    Hi,

    also ich würde das doch trennen. Letztlich brauchst Du doch nur die von Dir benötigten Funktionsprototypen zu extrahieren (eigentlich jedes Entwicklertool kann diese Funktionen im Source finden - selbst "UltraEdit"). Dann kannst Du "das Modelliertool" unabhängig vom Rest mit einem C-Compiler zu einer lib wandeln und dann ganz easy in Dein C++-Programm einbinden (wie schon gesagt: Header mit extern "C").

    Diese Entkopplung bringt eine Menge Vorteile .. nicht zuletzt die eingesparte Compilezeit. Wenn Du für jeden Test, jede Änderung an Deinem C++-Programm immer wieder die 16TZ mit durchnudelst, verbringst Du da schnell mehr Zeit mit Warten als Dich eine "Trennung" gekostet hätte.
    Außerdem: Wenn "das Modellierungstool" schlecht geschrieben wurde (und fehlende Header sind ein Indiz dafür), würde ich davon ausgehen, dass es nicht so einfach ist, das durch einen C++-Compiler zu prügeln - erst Recht, wenn man selbst noch C++-Code dazuschreiben will.

    Gruß,

    Simon2.



  • hmm, ja, wahrscheinlich könnte man das so ans Laufen bringen, aber leider geht das im Ziel der Sache vorbei, weil dann die jeweils beim Modellieren automatisch erstellten Dateien immer zuerst in eine Bilbiothek umgewandelt werden müssten bevor sie dann simuliert werden könnten. So brauch ich immer nur das eine CFile einzubinden. Aber erstmal muss ichs damit noch ans Laufen bringen...



  • Hi,

    ich glaube, ich hatte das Problem noch nicht richtig verstanden (jetzt komme ich ihm aber näher).
    Wenn ich das richtig sehe, macht Dir "die lib-isierung" das Ganze aber wirklich einfacher: Du brauchst nur noch dann eine lib zu erstellen, wenn Du wirklich am Modell etwas änderst.

    Aber mal 2 Fragen:
    1.) Wo liegt denn eigentlich Deine Hauptaufgabe - auf der C++- oder auf der Modellierungs/C-Seite ?
    Ich bin bislang immer von Ersterem ausgegangen (und dann wäre mein Vorschlag auf jeden Fall sinnvoller). Wenn Du aber fast ausschließlich am Modelliertool sitzt und das keine Liberstellung unterstützt, könnte das Anders sein.

    2.) Was macht denn eigentlich Dein Modelliertool ? Kompiliert das auch schon ? Eigentlich ist mir nicht klar, wieso Dein Linker überhaupt auf "C-Linkage" bei den modellierten Sourcen kommt, denn ein C++-Compiler macht natürlich auch für "freie Funktionen" ein C++-Name-Mangeling... Spickt das M-Tool evtl. den Source mit irgendwelchen "schrägen Pragmas", calling convenctions oder sonstigem Zeug ... oder spuckt das tatsächlich nur normalen C-Code aus ?

    Gruß,

    Simon2.


Anmelden zum Antworten