1. Dashboard
  2. Forum
    1. Unerledigte Themen
  3. Mitglieder
    1. Letzte Aktivitäten
    2. Benutzer online
    3. Team-Mitglieder
    4. Trophäen
    5. Mitgliedersuche
  4. Tutorial Bereich
  • Anmelden
  • Registrieren
  • Suche
Dieses Thema
  • Alles
  • Dieses Thema
  • Dieses Forum
  • Seiten
  • Forum
  • Lexikon
  • Erweiterte Suche
  1. Informatik Forum
  2. Webmaster & Internet
  3. Entwicklung

yacc - Compilerproblem

  • Christoph R.
  • 15. Oktober 2009 um 11:01
  • Unerledigt
  • Christoph R.
    16
    Christoph R.
    Mitglied
    Reaktionen
    36
    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!
    24
    Plantschkuh!
    Mitglied
    Reaktionen
    163
    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.

    *plantsch*

  • Christoph R.
    16
    Christoph R.
    Mitglied
    Reaktionen
    36
    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.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!

Benutzerkonto erstellen Anmelden

Benutzer online in diesem Thema

  • 1 Besucher

Rechtliches

Impressum

Datenschutzerklärung