Ошибка связи при использовании вывода lex и yacc в Visual Studio

Я использую эту версию windows flex (lex) и bison (yacc) для переноса моего компилятора запросов с linux на Windows. Выходные файлы, lex.yy.c, y.tab.c а также y.tab.h генерируются правильно. Однако я получаю следующую ошибку ссылки.

Error 29 error LNK2001: unresolved external symbol _yylval G:\Project\lex.yy.obj QC
Error 30 error LNK1120: 1 unresolved externals G:\Project\QC.exe QC

Я попытался скопировать вышеупомянутые файлы, сгенерированные оригинальными версиями linux flex и yacc, в папку проекта Visual Studio. Но это также дает ту же ошибку ссылки.

2 ответа

Решение

Это может произойти, потому что вы смешиваете файлы C++ и C вместе в одном проекте. Так что если вы включаете y.tab.h в .cpp Затем убедитесь, что файл extern "C" { ... } вокруг него. Как это:

extern "C"
{
    #include "y.tab.h"
}

Обновление: из вашего комментария я понял, что y.tab.c является y.tab.cc сейчас. Это приводит к ошибке времени ссылки. Это можно исправить, сделав оба файла C++ (или C). Или, изменив yylval декларация в y.tab.h в

#ifdef __cplusplus
extern "C" YYSTYPE  yylval;
#endif

Мне кажется, что вы связываетесь с библиотекой для flex или bison (давно я ее использовал, поэтому не могу точно вспомнить, с чем вы должны связываться) в unix, но не делал этого в windows. Вы связываете с теми же библиотеками на Windows?

Другие вопросы по тегам