Visual Studio. Зависимости проектов. Блокировка файлов.


Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Deprecated: Function eregi_replace() is deprecated in /hlds/web/u138079p19/code4life.ru/htdocs/wp-content/plugins/wp-note/wp-note.php on line 43

Notice: Функция get_currentuserinfo с версии 4.5.0 считается устаревшей! Используйте wp_get_current_user(). in /hlds/web/u138079p19/code4life.ru/htdocs/wp-includes/functions.php on line 3840

После выпуска SkyXEgine 0.9.0 у нас появились некоторые проблемы в Visual Studio 2013, а именно ребилд с первого раза не удавался, либо со второго, либо с третьего раза получалось собрать. Казалось бы, надо настроить зависимости и все будет нормально, но не так все просто. Нам это надоело и мы потратили около половины дня на решение этих проблем, но можно было бы потратить не более часа))

Проблема

Проблема заключалась в том, что компилятор выдавал ошибки вида:

LINK : fatal error LNK1104: cannot open file ‘sxcore.lib’

Это значит что не удалось открыть lib файл, возможно ранее его не удалось собрать. Одна из причин — это неправильно расставленные зависимости. Другая заключается в следующей ошибке:

C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets(341,5): error MSB6003: The specified task executable «CL.exe» could not be run. Запрошенную операцию нельзя выполнить для файла с открытой пользователем сопоставленной секцией.

То есть при компиляции исходного кода либо при попытке обращения к lib файлу он был заблокирован/открыт антивирусом.

Зависимости

Первое что потребовалось проверить и переделать это зависимости в 24 проектах. Для этого нужно на проекте нажать ПКМ и выбрать Build dependenciesProject dependencies  и в открывшимся окне отметить галками те проекты от которых напрямую зависит текущий выбранный проект.

Открытие окна зависимостей проекта в Visual Studio 2013
Открытие окна зависимостей проекта в Visual Studio 2013

В итоге сложились такие правила:

  • если проект1 использует проект2, проект2 использует проект3, но проект1 не использует проект3 то в зависимости проект1 ставить проект3 не надо
  • если проект1 использует проект2, проект2 использует проект3, проект1 использует проект3 то в зависимости проект1 надо ставить проект3

Настройки проектов

Затем оказалось что не все имеют опцию  Platform toolset — Visual Studio 2013 — Windows XP (v120_xp), разделе General. А еще ранее, не все проекты в настройках компиляции имели одинаковые параметры, а в опциях вывода файлов бардак. Можно сказать что в общем это вряд ли повлияет на ситуацию в ребилде, но порядок имеет свое влияние и вспоминая прошлые ошибки мы пришли к следующем правилам:

  • все проекты (projects) в решении (solution) должны иметь максимально одинаковые настройки компиляции, но бывают исключения
  • каждый проект должен выводить свои рабочие файлы в свою собственную директорию, ни какой из проектов не должен (по максимуму, ситуации разные бывают) перезаписывать рабочие файлы другого проекта
  • каждый проект (projects) в решении (solution) должен выводить свои итоговые файлы (exe, dll, lib и прочее) в соответствующую директорию, не надо держать каждый файл dll в рабочей директории

Блокировка файлов

Ситуация улучшилась, причем значительно, проверяя вверх по иерархии зависимостей проекты дошли до проблемного, но проблема оказалось в другом. В output окно выводилось сообщение об ошибке следующего содержания:

C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets(341,5): error MSB6003: The specified task executable «CL.exe» could not be run. Запрошенную операцию нельзя выполнить для файла с открытой пользователем сопоставленной секцией.

Эту проблемы можно решить двумя способами:

  • сделать одно поточную компиляцию (антивирус при этом перестал блокировать файлы), для этого надо зайти: ToolsOptionsProject and SolutionsBuild and Run и в текстовое поле maximum number of parallel project builds установить количество потоков (в данном случае 1), однако это не лучший способ решения проблемы, так как компилировать в одном потоке большой проект очень долго
  • добавить правила для антивируса, так как именно он блокирует файлы (мне помогла эта ссылка, несмотря на то что информация старая).

Для KIS 2016 перейти в Настройки — Защита — Контроль программ — Управление программами.

Защита - Контроль программ (KIS 2016)
Защита — Контроль программ (KIS 2016)
Управление программами (KIS 2016)
Управление программами (KIS 2016)

Далее необходимо найти (можно при помощи текстового поиска) Microsoft Visual Studio 2013 (в нашем случае название такое), нажать по этой строке ПКМ.

Ограничения программ (KIS 2016)
Ограничения программ (KIS 2016)

Далее ЛКМ на «Подробности и правила», перейти во вкладку исключения и поставить галку на «Не контролировать активность программы».

Правила программы (KIS 2016)
Правила программы (KIS 2016)

Добавлено 19.01.2018

Сегодня в очередной раз пересобирал весь проект, в debug режиме все нормально, а вот release не захотел собираться, все по тем же причинам (ошибки выше). Решение нашлось быстро, все действия проводил в антивирусе, только добавились правила и для других программ.

Для следующих программ (все в разделе Microsoft):

  • Miscrosoft©  Linker Stub (lib.exe)
  • Miscrosoft© C/C++ Compiler Driver (cl.exe)
  • MSBuild.exe
  • Microsoft© Visual Studio 2013 (devenv.exe)

необходимо указать 2 правила:

  1. Не контролировать активность программы (как на скриншоте выше)
  2. Не проверять открываемые файлы

Таким образом нам удалось добиться ребилда с первого раза. мы избавили себя от лишних нервов с ошибками ребилдов + теперь экономим время smile

Поделиться:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*