Первоначальный отказ от ответственности: у меня ограниченный опыт работы с C ++ в Visual Studio, так что будьте добры 🙂
Я пытаюсь использовать порт Windows Flex / Bison в своем проекте (VS2013), но после следования инструкциям, чтобы добавить настройки сборки (http://sourceforge.net/p/winflexbison/wiki/Visual%20Studio%20custom%20build%20rules/), условие не выполняется и не выполняется:
Target "BisonTarget" skipped, due to false condition; ('@(Bison)' != '') was evaluated as ('' != '').
Target "FlexTarget" skipped, due to false condition; ('@(Flex)' != '') was evaluated as ('' != '').
Очевидно, что это просто сбой, основанный на некоторой переменной build / environment, однако после долгого поиска в Google я не могу понять, где установлены переменные @ (NameHere), чтобы я мог форсировать сборку.
Может кто-нибудь посоветовать, где / как я бы изменил эти переменные, чтобы включить выполнение новых файлов сборки?
Убедитесь, что flex.exe и bison.exe находятся в вашей переменной PATH (добавьте их в% PATH%). У меня в моем PATH=%PATH%;C:\Cola\GnuWin32\bin
(Как только вы исправите PATH, вам нужно перезапустить Visual Studio)
Убедитесь, что GNU Tools.targets
или (независимо от имени файла) указано в пользовательских правилах сборки. В Visual Studio это глобальный параметр, поэтому он нужен только один раз для всех ваших проектов анализатора. Если нет, щелкните правой кнопкой мыши по проекту и выберите Build Customization, затем нажмите Find Existing … и перейдите к файлу .targets.
Щелкните правой кнопкой мыши по исходным файлам Bison и Flex (.y / .ypp или .l) и выберите из Item Type
соответствующий тип файла, он должен соответствовать целям, которые вы только что добавили. В раскрывающемся списке должны быть значения, такие как Flex и Bison. Item Type
,
относительно ('@(Flex)' != '')
Насколько я знаю, это условие MSBuild, и оно оценивает переменную как пустую. Если оно не пустое, Условие истинно и выполнит Цель.
Например, для контекста мой файл .targets имеет:
<Target
Name="_Bison"BeforeTargets="$(BisonBeforeTargets)"AfterTargets="$(BisonAfterTargets)"Condition="'@(Bison)' != ''"
Верьте или нет, я удалил и повторно добавил файлы .y и .l, и все заработало. Довольно странно, но кое-что стоит заметить, если у вас возникла такая же проблема.
Был предложен разработчиками библиотеки в https://sourceforge.net/p/winflexbison/discussion/general/thread/18a9d465/?limit=50