Ошибка связи при использовании результатов 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. Но это тоже дает ту же ошибку связи.

Ответ 1

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

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

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

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

Ответ 2

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