Включить файл в проект VS2017 c ++ по условию - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь построить проект c / c ++ в VS2017 [https://git.postgresql.org/gitweb/?p=psqlodbc.git;a=blob;f=winbuild/psqlodbc.vcxproj;h=c54c93007c07c2b13bbea4ede14a6ee0e11fdf5a;hb=c54c93007c07c2b13bbea4ede14a6ee0e11fdf5a][1]

В файле проекта есть условия

<ClCompile Include="$(srcPath)odbcapi30.c" />\r
<ClCompile Condition="'$(ANSI_VERSION)'=='no'" Include="$(srcPath)odbcapi30w.c" />\r
<ClCompile Condition="'$(ANSI_VERSION)'=='no'" Include="$(srcPath)odbcapiw.c" />\r

Я создал Unicode Debug / Release ANSI Debug/ Выпуск конфигурации и в свойствах проекта-> c \ c ++ -> Препроцессор Я добавил ANSI_VERSION = нет для Unicode и ANSI_VERSION = да для ANSI.

Но для любой платформы / конфигурации я вижу эти файлы вSolution Explorer, и они составлены VS2017.Как включить эти файлы в проект, только если условие истинно?

1 Ответ

0 голосов
/ 13 февраля 2019

Условие требует, чтобы ANSI_VERSION было свойством MSBuild.Они отличаются от определений препроцессора C ++ (которые являются входными данными, используемыми при компиляции файла, но не используются MSBUILD при тестировании файлов для компиляции - строго говоря, они используются препроцессором, но являются частью шага компиляции с точки msbuild).зрения)

Вы можете установить ANSI_VERSION в качестве свойства MSBUILD в файле проекта: -

Например: -

<PropertyGroup>
    <ANSI_VERSION>no</ANSI_VERSION>
    <ANSI_VERSION Condition="'$(Configuration)' == 'ANSI_DEBUG'">yes</ANSI_VERSION>
    <ANSI_VERSION Condition="'$(Configuration)' == 'ANSI_RELEASE'">yes</ANSI_VERSION>
</PropertyGroup>

Приведенное выше значение по умолчанию ANSI_VERSION равно no ипереопределяет «да», когда условие выполнено, но вы также можете по очереди протестировать каждую возможную конфигурацию, если хотите.

Условия также можно объединить в одно условие с или, если вы предпочитаете.

Лично я бы использовал true / false, а не yes / no.С true false вы можете просто проверить свойство как логическое значение, а не сравнивать со строкой (хотя, возможно, это также работает с да / нет - но я не пробовал)

Изменить в ответ на вопрос: вышеусловно исключает файлы из сборки, исключая их из отображения немного по-другому, так как для этого потребуется пользовательский интерфейс для повторного анализа проектов для обновления списка файлов.Может оказаться, что для вас лучше работает создание фильтра в проекте для этих файлов (т. Е. Щелкните правой кнопкой мыши проект в представлении решения и используйте Add-> New Filter).Затем условно используйте параметр ExcludeFromBuild, чтобы контролировать, какие конфигурации на самом деле их компилируют, вместо того, чтобы включать в CLCompile условия, что-то вроде: -

<ClCompile Include="SomeFile.cpp">
      <ExcludedFromBuild Condition="'$(Configuration)'=='Debug'">true</ExcludedFromBuild>
</ClCompile>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...