#c #compiler-construction #linker-errors #bison #flex-lexer
#c #компилятор-построение #компоновщик-ошибки #bison #flex-lexer
Вопрос:
Мой main.hpp
выглядит так :
#include "json.tab.h"
#include "ob.hpp"
extern Ob *ob;
В моем test.l
я написал :
%{
#include "main.hpp"
%}
%token KEY
%token COMMA
%%
KEY_SET : KEY {ob->someOp();}
| KEY_SET COMMA KEY {ob->someOp();}
%%
Но это дает мне :
C:......c:(.text 0x37a): undefined reference to `ob'
C:......c:(.text 0x38e): undefined reference to `Ob::someop()'
Итак, как я могу вызвать этот объект Ob из любого места моего синтаксического анализатора?
Мой класс акушерства( Ob.hpp
) :
#include <bits/stdc .h>
using namespace std;
#ifndef O_H_
#define O_H_
using namespace std;
class Ob {
public:
Ob();
~Ob();
someop();
};
#endif /*O_H_*/
И Ob.cpp
:
Ob::someop()
{
cout << "c is lit" << endl;
}
Теперь я сделал весь метод в Ob статическим, так что нет необходимости иметь экземпляр. И мое правило сборки выглядит примерно так :
g lex.yy.c test.tab.c main.cpp *.hpp -o test.exe
И я сделал генератор синтаксического анализа простым, без какого-либо вызова метода, и он работает нормально, без ошибок, без предупреждений :
%%
KEY_SET : KEY
| KEY_SET COMMA KEY
%%
И когда я добавил {Ob::someOp();}
, то это снова выдает мне ту же ошибку.
Все мои коды здесь : https://gist.github.com/maifeeulasad/6d0ea58cd70fbe255a4834eb46f2e1fd
Комментарии:
1. В сообщениях об ошибках ae говорится, что вы не определили
ob
илиOb::someop()
. Вы не показали никакого кода, который определяет любую из этих вещей. Поэтому на данный момент меня не удивляет, что вы получаете эти ошибки. Вы утверждаете, что вы определилиob
иOb::someop()
? Если это так, то вы должны показать этот код. Поскольку это ошибки компоновщика, некоторые подробности о том, как вы создаете свою программу, также помогли бы.2. @john Я добавил весь код, который, по моему мнению, мне нужен, можете ли вы проверить еще раз?
3. Ну, если это весь код, то по-прежнему нет определения для
ob
, иOb::someop()
это синтаксическая ошибка (тип возвращаемого значения отсутствует, предположительно, он должен бытьvoid Ob::someop()
). Поэтому я могу только предположить, что вы на самом деле не компилируете Ob.cpp , поскольку в противном случае вы бы увидели сообщения об ошибках компилятора.4. @john , 3-й sloc из
main.hpp
содержит ссылку на Ob с ключевым словом extern. Иtest.l
импортирует или включаетmain.hpp
.. не должноtest.l
иметь ссылку на Ob?? И я тоже пробовал с ключевым словом void .. и окончательное правило сборки имеетg lex.yy.c test.tab.c main.cpp -o test.exe
, которое содержитmain.cpp
. И он содержитmain.hpp
..5. Также: (1) эта проблема не имеет ничего общего с flex или bison. Это просто запутывает проблему (и, вероятно, сбивает с толку вас тоже). Сначала выясните, как написать программу на C , распределенную по нескольким файлам. Затем вы можете добавить flex и bison в микс. (2) Никогда не просите GCC скомпилировать файл заголовка (
*.hpp
), если вы не знаете, о чем просите. (То, что вы просите, — это предварительно скомпилированный заголовок. Если вы не знаете, что это такое, вы не хотите просить о его создании.) (3) Ob.cpp невозможно скомпилировать:<stdin>:13:12: error: ISO C forbids declaration of ‘someop’ with no type [-fpermissive]
. Пожалуйста, исправьте это
Ответ №1:
Вы должны передать все .cpp
файлы и no .hpp
команде компиляции. .hpp
Будет автоматически включен препроцессором. Если вы этого не сделаете (вы не включаете Ob.cpp
в свою команду), то он не сможет найти определение функций, содержащихся в них.
Итак, ваша команда компиляции должна быть такой:
g lex.yy.c test.tab.c main.cpp Ob.cpp -o test.exe
Комментарии:
1. извините, но это не работает … все еще не определено .. и я обновил вопрос, можете ли вы проверить еще раз??
2. В вопросе нет ничего, что указывало бы на то, что это проблема.
3. Посмотрите на команду компиляции и посмотрите на ошибку, которую она выдает. Это предполагает, что неопределенные ссылки вызваны отсутствием исходного файла.
4. Я не думаю, что это связано с сборкой, так как я тоже пытался
g lex.yy.c test.tab.c main.cpp *.hpp -o test.exe
… Я думаю, что проблема заключается в прямом объявлении , — не хватает знаний для написания кода на c , так как я не знаю, как структурировать эти коды, возможно, я что-то путаю, импортируя что-то лишнее где-то или я импортирую меньше .. Я обновил вопрос и добавил свой рабочий каталог в gist, пожалуйста, ознакомьтесь с ним … gist.github.com/maifeeulasad /…5. Прочитайте еще раз мой ответ и попробуйте мою команду и сообщите мне результаты.
Ответ №2:
Генератор синтаксического анализа выглядит следующим образом :
%{
#include<stdio.h>
#include "main.h"
#include "json.h"
using namespace Maifee;
%}
...
meaw : INTEGER {Json::ok();}
Заголовок:
#ifndef JSON_H
#define JSON_H
#include <bits/stdc .h>
using namespace std;
namespace Maifee{
class Json {
public:
static void ok();
};
#endif // JSON_H
Файл cpp :
#include <bits/stdc .h>
#include "json.h"
using namespace std;
using namespace Maifee;
void Json::ok()
{
//whatever here
}