yacc - Compilerproblem

  • 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?

  • 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*

Jetzt mitmachen!

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