1. Weiterleitung zu NetzLiving.de
  2. Forum
    1. Unerledigte Themen
  3. zum neuen Forum
  • Anmelden
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

yacc - Compilerproblem

  • Christoph R.
  • 15. Oktober 2009 um 11:01
  • Unerledigt
Hallo zusammen,

das Informatik-Forum geht in den Archivmodus, genaue Informationen kann man der entsprechenden Ankündigung entnehmen. Als Dankeschön für die Treue bekommt man von uns einen Gutscheincode (informatikforum30) womit man bei netzliving.de 30% auf das erste Jahr sparen kann. (Genaue Infos sind ebenfalls in der Ankündigung)

Vielen Dank für die Treue und das Verständnis!
  • Christoph R.
    Punkte
    2.626
    Beiträge
    428
    • 15. Oktober 2009 um 11:01
    • #1

    Hallo!

    Ich schreibe einen Parser in dem ich auch Klassen verwenden will. Das heißt ich kompiliere ihn als C++-Code, nicht als C.

    Auszug aus dem Makefile:

    Code
    all:
        lex -o scanner.c scanner.lex
        gcc -o scanner.o -c scanner.c
        yacc -d -o parser.cpp parser.ypp
        gcc -c -o parser.o parser.cpp
        gcc -o parser scanner.o parser.o -ll

    In der letzten Zeile, also beim Linken von Scanner und Parser (Der Scanner ist in C geschrieben) erhalte ich nun den Fehler: "parser.cpp:1252: Fehler: »yylex« wurde in diesem Gültigkeitsbereich nicht definiert". Anscheinend geht beim Zusammenfügen von C und C++ was schief.

    Wenn ich für den Scanner auch C++-Code erzeugen lasse (Option -c++ von lex), dann geht es erst recht nicht, weil er mir dann keine globale yylex erzeugt, sondern eine Klasse.

    Wenn ich alles auf C umstelle, dann geht es übrigens, nur kann ich dann natürlich im Parser keine Klassen verwenden.

    Hat jemand einen Tipp wie ich das Problem lösen könnte?

  • Plantschkuh!
    Punkte
    6.173
    Beiträge
    1.181
    • 15. Oktober 2009 um 11:33
    • #2
    Zitat von Christoph R.

    gcc -o scanner.o -c scanner.c


    Hier wird scanner.c als C kompiliert; im Objektfile scanner.o findet sich eine Funktion "yylex". (Mit "nm" anschauen!)

    Zitat

    gcc -c -o parser.o parser.cpp


    Hier wird parser.cpp als C++ kompiliert; es wird also name mangling durchgeführt, und in parser.o landet ein externes Symbol "_Z5yylexv".

    Das kann der Linker natürlich nicht auflösen. Mögliche Lösungen: Wenn der Scanner im gemeinsamen Subset von C und C++ liegt, einfach auch als C++ kompilieren; oder dafür sorgen, daß in parser.cpp eine Deklaration wie

    Code
    extern "C" int yylex();


    vorkommt. Dann wird der name auch nicht durch die Name-Mangel gedreht.

  • Christoph R.
    Punkte
    2.626
    Beiträge
    428
    • 15. Oktober 2009 um 12:25
    • #3

    Danke, hat funktioniert.

  • Maximilian Rupp 27. Dezember 2024 um 00:26

    Hat das Thema aus dem Forum Programmieren nach Entwicklung verschoben.

  1. Datenschutzerklärung
  2. Impressum