Где '$ OutDir', определенный в файле script в Visual Studio?

Существует множество макросов, которые Visual Studio использует в настройках проекта, которые перечислены здесь. Я не могу определить, где находятся эти макросы или идентификаторы, определенные в фактическом файле script (не в настройках проекта).

В моем случае я пытаюсь изменить выходную папку для проекта на папку отладки или выпуска решения (на один уровень вверх), но изменение "Output Directory" в настройках проекта не влияет.

Нет упоминаний об этих макросах в файле .vcxproj, так что я действительно не знаю, где они определены? Меня больше всего интересует $(OutDir), который я хочу изменить в папку debug/release решения. Кто-нибудь знает, где они определены?

Ответ 1

В Visual Studio 2010 основные параметры проекта будут определять выходную папку, макрос, заданный из этого назначения папки, равен $(OutDir). Существуют и другие предопределенные макросы, которые вы не можете изменить, но это вы можете.

Если я понимаю, что вы пытаетесь сделать, выполните следующие действия:

  • Откройте диалоговое окно свойств проекта.
  • В верхней части диалогового окна находятся два списка, один для "Конфигурация" и один для "Платформы". Выберите "Все" для списка "Конфигурация".
  • На странице "Общие настройки" вверху находится папка, обозначенная "Каталог вывода". Измените его на следующее (кавычки необязательные) "$ (SolutionDir) $(Конфигурация) \" . Важное значение имеет конечная обратная косая черта. Это параметр, который в конечном итоге выбирает $(OutDir).
  • Откройте элемент "Linker" в левом дереве. затем выберите "Общие".
  • На правой панели в верхней части списка находится параметр "Выходной файл". Он должен иметь значение "$ (OutDir) $(TargetName) $(TargetExt)" . Если это не так, установите его как таковое.
  • Восстановите мир.

Примечание. Если у вас несколько целевых платформ (например, win32 и x64), это немного больше, но не так уж плохо. Надеюсь, это поможет.


EDIT OP также хотел бы, чтобы файлы PDB и инкрементных ссылок не были опубликованы в одной папке, но хотят, чтобы там была опубликована библиотека импорта. Так.....

Чтобы изменить местоположение файла PDB:

  • Откройте файл проекта. Еще раз выберите параметр "Все", чтобы изменить все целевые настройки сборки (см. № 2 выше).
  • Выберите параметры компоновщика/отладки в левом дереве.
  • Второй элемент сверху должен быть "Создать файл базы данных программы". Измените его на "$ (IntDir) $(TargetName).pdb"

Инкрементный файл ссылок должен быть (насколько мне известно) в той же папке, что и конечная цель. Однако вы можете отключить инкрементную привязку, если хотите. Это делается в следующем месте:

  • Откройте файл проекта. Еще раз выберите параметр "Все", чтобы изменить все цели конфигурации сборки (см. № 1 выше).
  • Выберите настройки компоновщика/общие параметры проекта.
  • Четвертый элемент вниз должен быть "Включить инкрементную привязку". Установите Нет.
  • Если вы отключите инкрементную привязку, вы не можете использовать функцию редактирования отладки Edit and Continue PDB для Visual Studio, но пользовательский интерфейс слишком тупой, чтобы исправить это для вас, когда вы отключите инкрементную привязку, поэтому.. Выберите С++/General в панели проекта. тогда, если он установлен в "База данных программы для редактирования/продолжения", переведите его в База данных программы /Zi .

Для перемещения, где построена библиотека импорта.

  • Откройте файл проекта. Еще раз выберите параметр "Все", чтобы изменить все целевые настройки сборки (см. № 2 выше).
  • Выберите Linker/Advanced
  • На правой панели будет элемент, расположенный примерно наполовину вниз, Import Library. Измените его на "$ (OutDir) $(TargetName).lib"

Не спрашивайте меня, как избавиться от файла списка экспорта (.exp), потому что я честно не знаю.

Ответ 2

Большинство этих макросов определены в файле целей MSBuild, который включен в каждый проект VS2010. Где-то в вашем файле проекта, вероятно, около дна, вы найдете такую ​​строку:

<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

Если вы следуете цепочке переменных пути назад, вы в конечном итоге найдете папку, содержащую Microsoft.Cpp.targets, которая сама будет содержать:

    <Import Project="Microsoft.Common.targets" />

В этом файле вы найдете следующее примечание:

В главном файле проекта должно быть задано несколько свойств, прежде чем использовать этот файл .TARGETS.    Однако, если свойства не установлены, мы выбираем некоторые значения по умолчанию.

OutDir:    Указывает конечное местоположение вывода для проекта или решения. При создании решения

По умолчанию, который выбирает MSBuild, используется по умолчанию $(OutDir) - $(OutputPath), если он явно не установлен. $(OutputPath) определяется в файле проекта, поэтому изменение этого свойства до включения файла целей изменит значение по умолчанию $(OutDir). Вы также можете просто указать значение для $(OutDir) в командной строке msbuild, используя /p:OutDir=bin\DebugElsewhere или что-то еще, и это переопределит любые значения по умолчанию, которые MSBuild хочет использовать. (Это то, что TFSBuild делает, например, чтобы получить все в решении, сбрасываемом в ту же папку.)

Кроме того, для возможной будущей ссылки большинство оставшихся макросов также определены в этом файле, несколько ниже:

<PropertyGroup>
  <TargetDir Condition="'$(OutDir)' != ''">$([MSBuild]::Escape($([System.IO.Path]::GetFullPath(`$([System.IO.Path]::Combine(`$(MSBuildProjectDirectory)`, `$(OutDir)`))`))))</TargetDir>
  <TargetPath Condition=" '$(TargetPath)' == '' ">$(TargetDir)$(TargetFileName)</TargetPath>
  <ProjectDir Condition=" '$(ProjectDir)' == '' ">$(MSBuildProjectDirectory)\</ProjectDir>
  <ProjectPath Condition=" '$(ProjectPath)' == '' ">$(ProjectDir)$(ProjectFileName)</ProjectPath>
      .
      .
      .
</PropertyGroup>

Ответ 3

Позвольте мне рассказать о том, что я узнал, задав этот вопрос. Эти макросы/свойства являются значениями по умолчанию VS2010, но вы можете установить их самостоятельно в файлах .vcproj, отредактировав их в блокноте. Примечание: сначала найдите свойство в файле .vcproj, если оно там, а измените его значение на желаемое, если не определить его, как показано ниже. Я думаю об этом, так как переопределение этих параметров определяется путем добавления/редактирования их в файлах .vcproj.

  <PropertyGroup Label="My Values">
    <ProjectName>New_Project_Name</ProjectName>
  </PropertyGroup>

Я определил свою собственную группу "Мои значения", чтобы сохранить эти значения, но вы можете определить их в любом месте. Я предпочитаю определять их как можно больше в файле, чтобы остальная часть script приняла их во внимание.