Как отключить sdl в Visual Studio 2019

Обновлено: 01.07.2024

За прошедшие годы Microsoft вложила значительные средства в безопасность, успешно изменив восприятие рынком собственных продуктов с одного из самых небезопасных на надежное и безопасное программное обеспечение. Их процесс безопасного жизненного цикла разработки (SDL) стал основным фактором, стоящим за этим важным изменением. Microsoft развернула политику безопасности по умолчанию и представила ряд передовых практик для разработчиков. Но их программа SDL на этом не остановилась; они фактически внедрили эти передовые методы внутри компании. Чтобы помочь разработчикам Windows в дальнейшем безопасном кодировании, некоторые части процесса SDL были отражены в различных выпусках Visual Studio в течение некоторого времени. В этой статье я описываю некоторые функции SDL, реализованные в Visual Studio 2013 и операционной платформе Windows. Поскольку на момент написания Visual Studio 2015 уже была доступна, можно спорить, зачем иметь дело со старой версией. Обоснованием этого решения является тот факт, что многие разработчики все еще используют версию 2013 года. Кроме того, большая часть этой статьи относится и к выпуску 2015 года, и в процессе обсуждения также обсуждаются некоторые эксклюзивные функции VS 2015.

Прежде чем мы углубимся в технические детали, важно отметить, что передовой опыт SDL становится общим требованием соответствия. Возьмем, к примеру, Требование 6. Разрабатывайте и обслуживайте безопасные системы и приложения на основе
PCI-DSS. Очевидно, что SDL может помочь вам выполнить это требование. Хотя существует множество других стандартов или отраслевых норм, требующих той или иной формы SDL, они обычно не зависят от технологии и методологии. Это важное замечание, поскольку Visual Studio — по понятным причинам — поддерживает исключительно процесс Microsoft SDL [1]. Например, если вы следите за публикациями OWASP, вы самостоятельно реализуете надлежащие наборы правил и другие действия в рамках Visual Studio. Это не означает, что вы не должны следовать передовым практикам, не принадлежащим Microsoft, — напротив, их реализация может потребовать дополнительной работы.

Защита стека (/GS)

Из-за высокой популярности переполнения буфера в предыдущие десятилетия начались поиски устранения этого класса уязвимостей. Некоторые пытались научить разработчиков, как разрабатывать безопасный код, другие предоставляли улучшенные функции замены для тех, которые обычно являются причиной переполнения буфера (сразу приходит на ум strcpy), или пытались модифицировать компилятор таким образом, чтобы он обнаруживал переполнение буфера и останавливал потенциальное нападение. Microsoft VS 2013 предоставляет все вышеперечисленные методы.

Модификация компилятора обычно основана на размещении файла cookie, также называемого канареечным, в стеке. Если срабатывает классическое переполнение буфера, cookie перезаписывается в стеке. Прежде чем вернуться к вызывающей стороне, эпилог функции проверяет целостность файла cookie в стеке. Если значение отличается от обнаруженного переполнения стека. Дальнейшее зависит от конкретного компилятора (включая его настройки) и операционной платформы. Та же концепция используется в Visual Studio и скрыта под немного вводящим в заблуждение названием «Включить проверку безопасности».


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

Имейте в виду, что меры безопасности, описанные выше, защищают адрес возврата в стеке. Однако он не защищает от всех типов переполнений буфера, даже если мы ограничим сценарий атаки кадром стека. Например, если у вас есть указатель vtable в стеке, буфер перезаписи может позволить изменить его и восстановить контроль до того, как будет выполнена проверка /GS. Одним из примеров такой атаки является техника под названием VTable hijacking.

Проверки SDL (/sdl)


Попытка скомпилировать исходный код с помощью небезопасных функций CRT, таких как gets() или strcpy(), при включенных проверках SDL приводит к следующей ошибке:


Анализ кода

Visual Studio также предоставляет возможность статического анализа исходного кода, которую можно использовать для обнаружения определенных проблем, связанных с безопасностью.

Выполнение анализа небезопасного кода, как в нашем примере с gets(), приводит к выделению потенциально уязвимого кода, как показано ниже:


Кроме того, окно анализа кода показывает объяснение для каждого возможно небезопасного кода:


К сожалению, набор правил по умолчанию, поставляемый с Visual Studio, довольно ограничен. Например, он не обнаруживает вызовы strcpy(), но можно сказать, что это нормально, поскольку компилятор во время компиляции либо сообщит об этом, либо выдаст ошибку, когда переключатель /sdl включен. Однако, поскольку набор правил может помечать вызовы gets() как опасные, почему он не может сделать то же самое с другими функциями, связанными со строками, с длинной историей переполнения буфера, я не понимаю.

Еще одним ограничением является простота набора правил, касающихся безопасности. Например, собственный вызов безопасности Microsoft [3] может быть скомпилирован, а исходный код может быть просканирован без предупреждения. Можно возразить, что этот пример относится к 2014 году, поэтому наборы правил 2013 года могут не выявить проблему, однако обновление 5, используемое в этой статье, относится к 2015 году.

В целом, с точки зрения безопасности, параметры анализа кода VS звучат великолепно, поскольку статический анализ может предоставить очень ценную информацию. К сожалению, из-за небольшого количества правил и интеллекта механизма анализа его использование ограничено и поэтому не может рассматриваться как замена специализированным инструментам статического анализа исходного кода. Тем не менее, эта функция может и должна использоваться разработчиком для реализации некоторых передовых методов SDL на уровне исходного кода. Честно говоря, многие другие IDE, даже для языков, отличных от C/C++, также предоставляют (если таковые имеются) только самые основные правила для обнаружения проблем с качеством и безопасностью.

Тот факт, что некоторые рекомендации устарели или не обновлялись в течение некоторого времени, не означает, что их не следует использовать. Ниже приведены некоторые передовые практики SDL для кодирования C/C++, которые не ограничиваются только VS 2013 или 2015, но доступны для ряда компиляторов.

Strsafe.h

Библиотека Strsafe.h [4] по-прежнему доступна, и если по какой-то причине вам приходится использовать такие функции, как strcpy или strcat, вам следует рассмотреть возможность замены библиотеки. Чтобы использовать его, включите его в свой stdafx.h, как и любую другую библиотеку:

Ниже представлена ​​таблица функций, основанных на подсчете символов:

В следующей таблице рассматриваются функции, основанные на подсчете байтов:

Имейте в виду, что эти функции не являются частью автономной документации VS 2015.

Безопасная замена *_s в CRT

Visual Studio в stdio.h предоставляет набор безопасных замен для небезопасных функций, таких как gets или strcpy. Например, вместо кода:

strcpy_s(buf, 10, сообщение);

Если доступна безопасная замена для определенной функции CRT, компилятор выдаст предупреждение, если не включены проверки /sdl. В таком случае генерируется ошибка вместо предупреждения. Обратите внимание, что так называемые «безопасные» функции замены по-прежнему могут использоваться не по назначению.


Усовершенствования безопасности VS CRT обеспечивают функцию безопасной перегрузки шаблона [5].
когда для параметра _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES установлено значение 1. Это позволяет автоматически заменять небезопасную функцию CRT на ее безопасный аналог без генерации предупреждения.

Дополнительные функции безопасности в CRT

Надежная замена некоторых функций CRT — не единственное улучшение, доступное программистам. Еще одна приятная функция — проверка параметров. Проверка параметров проверяет указатели NULL, недопустимые константы перечисления и проверяет диапазон целых чисел. При обнаружении недопустимого параметра вызывается недопустимая процедура обработчика. Этот обработчик, называемый подпрограммой обработчика недопустимых параметров, по умолчанию выполняет отчет о сбоях Watson. Однако это поведение можно изменить, установив собственную процедуру с помощью функции _set_invalid_parameter_handler().

Помимо проверки, функции CRT также обеспечивают правильный формат данных. Например, безопасные функции CRT гарантируют, что строки правильно заканчиваются нулем, что не всегда имеет место в случае небезопасных версий. Кроме того, проверяется синтаксис строки формата, что приводит к обнаружению полей неправильного типа. Это помогает предотвратить некоторые уязвимости строки формата.

При передаче буфера безопасные функции CRT также требуют передачи размера буфера. Размер буфера проверяется перед выполнением фактической операции над буфером, чтобы убедиться, что размер правильный. Это помогает предотвратить некоторые ошибки переполнения буфера.

При использовании безопасных функций CRT по умолчанию принудительно применяется безопасный файловый ввод-вывод Windows.То же правило применяется к API-интерфейсам процессов, что также приводит к невозможности указать ACL, если небезопасные функции не предоставляют такой возможности. Использование собственных списков управления доступом вместо стандартных списков управления доступом помогает усилить безопасность приложения.

Библиотека классов SafeInt

SafeInt [6] — это библиотека классов C++, обеспечивающая защиту от целочисленного переполнения, которое может произойти во время математических операций. Полную справку по классам см. в MSDN [7].

Чтобы использовать класс SafeInt, просто включите SafeInt.hpp в свой проект. Он определяет символ SAFEINT_HPP, поэтому вы можете проверить, включен ли он уже.

В библиотеке определены классы SafeInt и SafeIntException.

SafeInt можно использовать с другими компиляторами, помимо тех, которые входят в пакет Visual Studio. Для получения более подробной информации, включая загрузку исходного кода SafeInt, посетите домашнюю страницу SafeInt [7].

Во время компиляции SafeInt пытается обнаружить используемый компилятор. Проверьте, поддерживается ли ваш компилятор, если вы планируете использовать SafeInt вне среды VS.

Проверенные итераторы

Это еще одна мера предотвращения переполнения, присутствующая в VS. Проверенные итераторы [8] гарантируют, что границы вашего контейнера не будут перезаписаны. Если _SECURE_SCL определен как один, любое небезопасное использование итераторов приводит к завершению программы. Проверенные итераторы можно использовать как с отладочными, так и с выпускными сборками.

Проверенный итератор вызовет уже описанную процедуру обработки недопустимых параметров, если код попытается выйти за границу контейнера.

Установка _SECURE_SCL на 0 приводит к тому, что все итераторы стандартов не проверяются на наличие границ.

Проверки во время выполнения

Проверки во время выполнения предоставляют полезный набор функций:

  • Проверка кадров стека во время выполнения
  • Обнаружение неинициализированных переменных
  • Потеря данных при присвоении значения меньшему типу данных

Процесс SDL основан не только на специальных мерах безопасности компиляторов Visual Studio или внешних библиотеках C/C++, но также включает функции, связанные с безопасностью платформы Windows. Ниже приведен краткий обзор выбранных мер безопасности платформы.

Привилегии

Privilege — это механизм Windows, а не Visual Studio. Тем не менее из-за их решающей роли в модели безопасности Windows ни один документ, связанный с SDL, не может считаться полным без его упоминания. Ниже приведены некоторые основные, но важные советы:

  • Не запускайте свой код с повышенными привилегиями (например, с правами администратора). Используйте CheckPrivilege, чтобы определить, какие привилегии включены в маркере.
  • По возможности используйте токены с ограниченным доступом. Вы можете создать токен с ограниченным доступом с помощью CreateRestrictedToken.
  • Используйте олицетворение, если ваш код запускается с высокими привилегиями, однако имейте в виду, что это не работает, например, как разделение привилегий в некоторых системах BSD. Причина в том, что если процесс, работающий под олицетворенной учетной записью, вызывает RevertToSelf, он возвращается к исходным привилегиям. Даже если процесс не вызывает его напрямую, помните, что злоумышленник может создать удаленный поток и внедрить, например, вызов RevertToSelf.

Защитные страницы

Функции, связанные с памятью, такие как VirtualProtect и VirtualAlloc, принимают константу PAGE_GUARD (0x100) [11]. Когда запущенный процесс пытается получить доступ к адресу в диапазоне защитных страниц, система вызывает исключение STATUS_GUARD_PAGE_VIOLATION (0x80000001) и очищает атрибут PAGE_GUARD для этой области памяти. Guard Pages — это интересный механизм, который можно использовать внутри приложения для управления большими структурами данных, которые имеют тенденцию к быстрому росту. Такие структуры подвержены проблемам с повреждением памяти, поэтому добавление дополнительного уровня безопасности имеет большой смысл. Возможный недостаток заключается в том, что этот механизм никоим образом не применяется самим компилятором VS. Вместо этого разработчик должен развернуть его, что означает написание дополнительного кода, чего большинство людей стараются избежать любой ценой.

Примечание. Защитные страницы — в качестве меры безопасности — также доступны на операционных платформах, отличных от Windows. Подробности реализации см. в документации по операционной системе.

Исполняемый файл с поддержкой рандомизации адресного пространства пользователя (ASLR)

VS позволяет вам воспользоваться функцией рандомизации адресного пространства (ASRL), представленной в Windows Vista. Им можно управлять с помощью параметра /DYNAMICBASE [12]. В случае Visual Studio 2013 этот параметр включен по умолчанию, поэтому не требуется никаких дополнительных действий для создания исполняемого файла, который может динамически перемещаться во время загрузки. Этой функцией также можно управлять с помощью параметра проекта в свойстве «Случайный базовый адрес».

Как и Guard Pages, ASLR также доступен на некоторых платформах, отличных от Windows. Подробности реализации см. в документации по операционной системе.

Не каждое действие SDL может или должно выполняться в среде Visual Studio. Например, этап проверки SDL определяет, среди прочего, следующие две практики:

Microsoft любезно предоставляет дополнительные бесплатные инструменты, которые помогут вам в выполнении этих действий:

Одним из инструментов, отсутствующих в списке Microsoft, является их собственный пакет WinDbg [13]. WinDbg — благодаря своим возможностям сценариев и архитектуре плагинов — является хорошей отправной точкой для инструментирования двоичных файлов. Его можно не только использовать для мониторинга целевого приложения во время фаззинга или тестирования, но также можно превратить в фаззер. Во многих случаях, что касается бинарного инструментария, вы можете получить ту же функциональность с помощью IDA [14], но выбор за вами.

Больше не получает()

Visual Studio 2015 CRT не поддерживает небезопасные функции, такие как, например, gets(). Вместо этого поддерживаются только безопасные замены — например, в случае gets() безопасная замена называется gets_s(). Это незначительное изменение, особенно по сравнению с CFG, описанным в следующем разделе.

Защита потока управления

Опция Control Flow Guard (CFG), также называемая иногда параметром /guard [15], представляет собой новую технику защиты от эксплойтов, доступную разработчику.

Опцию Control Flow Guard можно включить либо из командной строки с помощью /guard:cf, либо из IDE, установив для параметра Project -> Properties -> Configuration Properties -> C/C++ -> Code Generation -> Control Flow Guard значение Yes. Обратите внимание, что эта защита по умолчанию отключена, поэтому вам нужно явно включить ее.

CFG пытается обнаружить методы эксплуатации на основе повреждения памяти, контролируя адрес выполнения и косвенные вызовы. Обратите внимание, что для использования этой защиты базовая платформа должна быть «с поддержкой CFG», что означает x86 и x64 Windows 10 и Windows 8.1 с установленным накопительным пакетом обновления за ноябрь 2014 г. (KB3000850).

И последнее, но не менее важное: можно явно отключить CFG с помощью параметра /guard: cf-.

При обсуждении рекомендаций по безопасному кодированию на C++ не следует игнорировать рекомендации CERT для C++ [16] и Безопасное кодирование в C++ [17]. Хотя это, безусловно, стоит прочитать, если вы ориентируетесь на платформу Windows, не ожидайте подробностей о ней — обе публикации в большей степени ориентированы на Unix. [17] также нацелен в основном на компилятор gcc. Имейте в виду, что меры безопасности, работающие на уровне генерации собственного кода, реализуются по-разному для каждого компилятора. Следовательно, некоторые функции, связанные с безопасностью формата PE-файлов, в этих публикациях не обсуждаются.

В Visual Studio 2015 компилятор C++ не установлен по умолчанию, что многое говорит о том, как Microsoft видит будущее тех или иных языков. В то же время VS поддерживает, например, язык Python с открытым исходным кодом. Это также ясно демонстрирует направление, в котором хочет двигаться Microsoft, и то, куда хотят двигаться разработчики, особенно с учетом перехода к облачным технологиям. Тем не менее, есть сектора, все еще использующие код C/C++ для критически важных приложений, и C/C++ никуда не денется в ближайшее время. Ряд основных приложений в финансовом и платежном секторах написан на C/C++, некоторые из них используют компиляторы Microsoft. Обычно поставщики и их клиенты не хотят полностью переписывать код только потому, что некоторые новые языки становятся популярными среди разработчиков. Никто не хочет прикасаться к алгоритмам бухгалтерского учета, которые считаются безошибочными и проверенными. Это означает, что проблемы с безопасностью C/C++ останутся с нами на какое-то время, и нам все равно придется с ними разбираться. С другой стороны, многие концепции безопасного кодирования из C/C++ можно легко воспроизвести на другие языки. Даже если вы разрабатываете свой код для одного из динамических языков сценариев на основе байт-кода, вы все равно должны помнить, что базовая инфраструктура виртуальной машины или интерпретатора, вероятно, реализована на C/C++. Это означает, что понимание проблем безопасности, связанных с C/C++, может помочь вам не только справиться с уязвимостями в тех слоях, которые могут косвенно повлиять на ваш код, но и фактически избежать некоторых из них.

Microsoft также предоставляет некоторые рекомендации по работе с управляемым кодом/управляемыми компиляторами. Они не обсуждались в этой статье, так как она сосредоточена исключительно на C/C++. Некоторые вопросы, связанные с C++, также не обсуждались из-за нехватки места. Для этого вместо статьи потребуется книга.

Формат файла PE+ и его функции безопасности практически не обсуждались. Понимание формата исполняемого файла имеет решающее значение для понимания последствий и ограничений различных мер безопасности, введенных на этапах генерации кода и компоновки. Функции безопасности операционной системы также влияют на формат исполняемого файла и способ его загрузки в память. Хорошим примером может быть требование SDL для отсутствия общих разделов в двоичных файлах выпуска.

В качестве основы для этого текста использовалась Microsoft Visual Studio Community Edition 2013, версия 12.0.40629.00, обновление 5.

Являетесь ли вы начинающим программистом на C++ или опытным разработчиком программного обеспечения, программирование графики — это образовательный и полезный опыт. Simple DirectMedia Layer — это библиотека C (совместимая с C++), которая обеспечивает простой низкоуровневый доступ к.

Настройка Visual Studio

Изображение 1, как настроить SDL с помощью Visual Studio

Выделите шаг или подшаг. Выделите шаг или подшаг, который вы ожидаете сделать, а затем выполните его. См. пример на картинке выше.

Изображение 2, как настроить SDL с помощью Visual Studio

При загрузке установите флажок Разработка для настольных ПК с рабочей нагрузкой C++. При необходимости прокрутите страницу вниз.

Скачивание SDL

Изображение 3, как настроить SDL с помощью Visual Studio

Изображение 4, как настроить SDL с помощью Visual Studio

  1. В окне загрузки у вас есть папка SDL2-2.0.10, (или последняя версия). Щелкните его> щелкните правой кнопкой мыши> выберите «Копировать». (Или, как вариант, щелкните его и перетащите в C:GL).
  2. Перейдите к C:GL. Внутри GL щелкните правой кнопкой мыши > выберите "Вставить".
  3. Нажмите на имя SDL2-2.0.10 (или последнюю версию) и переименуйте его в SDL2. Теперь в папке GL у вас есть папка SDL2.

Создание проекта Visual Studio

Изображение 5, как настроить SDL с помощью Visual Studio

  1. Если Visual Studio 2019 не открыт. Откройте его > Нажмите Создать новый проект > Пустой проект > Далее.
    1. В текстовом поле "Имя проекта" введите: Project-0.
    2. Нажмите рядом с текстовым полем "Местоположение". > Перейдите к C: > GL > нажмите «Выбрать папку». Теперь «Местоположение» — C:GL.
    3. Отметьте «Поместить решение и проект в один каталог» > нажмите «Создать» . Дождитесь появления экземпляра Visual Studio 2019.

    Изображение 6, как настроить SDL с помощью Visual Studio

    1. В окне "Обозреватель решений" щелкните правой кнопкой мыши папку "Исходные файлы" (последняя).
    2. Нажмите «Добавить > «Новый элемент…»
    3. В окне «Добавить новый элемент — Project-0» выберите «Файл C++ (.cpp)» — первый. "Имя:" Source.cpp в порядке.
    4. Местоположение должно быть C:GLProject-0. Если это не так, нажмите . справа от поля и перейдите к C: > GL > Project-0. Нажмите «Выбрать папку». Теперь «Местоположение» — C:GLProject-0.
    5. Нажмите кнопку "Добавить". Файл откроется в основном текстовом редакторе, но пока оставьте файл пустым.

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

    Изображение 7, как настроить SDL с помощью Visual Studio

      (1) Дополнительные каталоги включения.
        Откройте раскрывающееся меню C/C++. Нажмите «Общие»> «Дополнительные каталоги включения»> стрелку вниз справа от поля> «Изменить» в раскрывающемся меню.

      Изображение 9, как настроить SDL с помощью Visual Studio

      Изображение 10, как настроить SDL с помощью Visual Studio

      1. В верхней части мастера «Дополнительные каталоги библиотек» щелкните первый значок > щелкните . рядом с текстовым полем.
      2. В мастере «Выбор каталога» выберите C: > GL > SDL2 и дважды щелкните папку «lib», а затем щелкните папку «x86». «Папка» — «x86». Нажмите «Выбрать папку» в окне «Выбор каталога» и «ОК» в мастере «Дополнительные каталоги библиотек».

      Изображение 11, как настроить SDL с помощью Visual Studio

      1. Скопируйте opengl32.lib; SDL2.lib;SDL2main.lib и вставьте в самое верхнее текстовое поле мастера «Дополнительные зависимости» > нажмите «ОК» в мастере «Дополнительные зависимости».

      Изображение 12, как настроить SDL с помощью Visual Studio

      1. Перейдите к C: > GL > Project-0. Щелкните правой кнопкой мыши пустую область в папке "SDLproject" и выберите "Вставить".
      2. Файл "SDL2.dll" теперь находится в папке проекта "Project-0" вместе с "Source.cpp" и другими 4 файлами, созданными Visual Studio.

      Изображение 13, как настроить SDL с помощью Visual Studio

      Тестирование вашего проекта

      Протестируйте свой проект. Скопируйте следующий код и вставьте в область кода Source.cpp. Нажмите Ctrl+F5. Если проект собирается и появляется белое окно с заголовком "Окно SDL2", значит, проект настроен правильно. Теперь вы готовы программировать с помощью SDL.

      Исправление ошибок, если они есть

      1. не удается открыть файл SDL.h, перейдите к части 4, шаг 1, настройка свойств проекта, подэтап "Настройка дополнительных каталогов включения" и следуйте инструкциям.
      2. не удается открыть файл SDL2.lib или SDL2main.lib, перейдите к части 4, шагу 1, подшагу Настройте «Дополнительные каталоги библиотек» и следуйте инструкциям. Также к подэтапу «Настроить дополнительные зависимости».
      3. "точка входа должна быть определена" перейдите к части 4, шагу 1, подэтапу "Настройка системы" и следуйте инструкциям.

      В открытом окне с X в красном кружке. Если сказано, что файл SDL2.dll отсутствует, перейдите к части 4, шагу 2, Скопируйте файл "SDL2.dll" и вставьте в папку проекта, следуя инструкциям.

      Для других ошибок. Если вы не можете их исправить, закройте Visual Studio > удалите папку проекта Project-0, которая находится в C:GL > откройте Visual Studio > повторите настройку из части (метода) 3. Хорошая работа.

      Создание проекта с помощью шаблона SDL

        В «Выбрать параметры шаблона» для «Имя шаблона:» введите SDL. Нажмите Готово . Шаблон создан.

      Изображение 14, как настроить SDL с помощью Visual Studio

      1. Нажмите Файл >Создать >Проект. .
        1. В мастере создания нового проекта прокрутите список шаблонов вниз и выберите SDL > нажмите "Далее" .
        2. В мастере настройки нового проекта в текстовом поле «Имя проекта» введите Project-1. Расположение должно быть C:GL. Убедитесь, что установлен флажок Поместить решение и проект в один каталог. Нажмите "Создать" .
          1. Если появится его код, все в порядке. Если нет, щелкните правой кнопкой мыши Source.cpp в разделе Исходные файлы > выберите Исключить из проекта и создайте новый Source. cpp файл.
          2. Если появится сообщение мастера: Файл 'C:GLProject-1Source.cpp' уже существует в проекте, перейдите по этому пути и удалите файл Source.cpp. . Нажмите «ОК» в мастере, а затем нажмите «Добавить» в окне Добавить новый элемент — проект-1. Теперь в разделе Solution Explore в разделе Исходные файлы у вас есть новый файл Source.cpp.

          Изображение 15, как настроить SDL с помощью Visual Studio

          1. Файл "SDL2.dll" следует скопировать из предыдущей папки проекта SDL и вставить в новую папку проекта.

          Создать проект для платформы x64

          1. В Active Solution Platform выберите x64.
          2. В записи Платформа автоматически выбирается x64.
          3. Нажмите "Закрыть".
          4. Совет. Даже если в мастере Страницы свойств в записи Платформа: установлено значение x64, щелкните Диспетчер конфигурации. , а в разделе Active Solution Platform выберите x64.
          1. В верхней части мастера «Дополнительные каталоги библиотек» щелкните первый значок > щелкните . рядом с текстовым полем.
          2. В мастере «Выбор каталога» выберите C: > GL > SDL2 и дважды щелкните папку «lib», а затем щелкните папку «x64». «Папка» — «x64». Нажмите «Выбрать папку» в окне «Выбор каталога» и «ОК» в мастере «Дополнительные каталоги библиотек».
          1. C: > GL > SDL2 > lib > x64. В папке "x64" щелкните файл "SDL2.dll" > щелкните правой кнопкой мыши > "Копировать".
          2. C: > GL > Project-2. Щелкните правой кнопкой мыши пустое место в папке "Проект-64" и выберите "Вставить".
          1. Совет. Даже если в основных настройках Страницы свойств указано Платформа: x64 , щелкните Диспетчер конфигурации. а в Active Solution Platform выберите x64.
          1. СОВЕТ. В каждом проекте, который вы создаете с его помощью, выберите x64 (рядом с пунктом "Отладка") в графическом интерфейсе Visual Studio.

          Компиляция исходного кода с помощью CMake и Visual Studio

          Компиляция библиотеки из исходного кода гарантирует, что получившаяся библиотека будет идеально адаптирована для вашего ЦП/ОС, чего не всегда могут предложить предварительно скомпилированные двоичные файлы. Также важно, чтобы двоичные файлы, которые вы получаете, предназначались для платформы x64.

          Изображение 16, как настроить SDL с помощью Visual Studio

          Создайте папку GL. В проводнике Windows в каталоге C: щелкните правой кнопкой мыши пустую область > выберите Создать > Папка > введите: GL > нажмите ↵ Enter .

          Изображение 17, как настроить SDL с помощью Visual Studio

          1. Скопируйте и распакуйте ZIP-архив.
            1. В окне загрузки щелкните папку > щелкните правой кнопкой мыши > в раскрывающемся меню выберите Копировать.
            2. Перейдите в каталог C: > GL > щелкните правой кнопкой мыши > выберите Вставить.
            3. Когда копирование и распаковка (извлечение файлов) завершены, дважды щелкните папку разархивирования cmake-3.16.2-win64-x64 (или последней версии) > bin > внутри вы должны увидеть логотип CMake рядом с именем файла cmake- gui > дважды щелкните этот файл. Если появится мастер «Windows защитит ваш компьютер», нажмите «Дополнительная информация» > «Выполнить в любом случае». Теперь у вас на экране графический интерфейс CMake.
            4. Каждый раз, когда вам понадобится CMake, перейдите в C: > GL > cmake-3.16.2-win64-x64 (или последняя версия) > bin > дважды щелкните файл cmake-gui (тот, где логотип CMake).
            1. Скопируйте и разархивируйте папку.
              1. В окне загрузки щелкните zip-папку SDL2-2.0.10.zip (или последнюю версию) > щелкните правой кнопкой мыши > выберите Копировать.
              2. Перейдите к C: > GL > щелкните правой кнопкой мыши > выберите Вставить.
              3. Теперь в каталоге C:GL у вас есть распакованная папка SDL2-2.0.10. Дважды щелкните его имя > удалить имя > введите: SDL > нажмите ↵ Enter .
              1. В текстовом поле Имя проекта введите: pb-0.
              2. Рядом с текстовым полем Местоположение нажмите . .
              3. Перейдите к C: > GL > Нажмите Выберите папку. Расположение: C:GL.
              4. Установите флажок Поместить решение и проект в один каталог.
              5. Нажмите "Создать" .
              1. В окне Добавить новый элемент — pb-0 щелкните Файл C++ (.cpp) (первый) в середине окна. В текстовом поле Имя введите Main.cpp.
              2. Расположение — C:GLpb-0.
              3. Нажмите кнопку "Добавить". Файл откроется в основном текстовом редакторе, но пока оставьте его пустым.
              1. (1) Главное меню страниц свойств pb-0. В записи Платформа выберите x64 > щелкните Диспетчер конфигураций. .
                1. В Active Solution Platform выберите x64.
                2. В записи Платформа автоматически выбирается x64.
                3. Нажмите "Закрыть" .
                  1. Перейдите к C: > GL > SDL > include > нажмите "Включить" > нажмите "Выбрать папку" > нажмите "ОК" .
                    1. Перейдите к C: > GL > SDL > build > Debug > нажмите "Выбрать папку" > нажмите "ОК".
                    1. Перейдите к C: > GL > pb-0 и вставьте. Теперь в папке проекта pb-0 у вас есть файл DLL SDL2d.dll среди Source.cpp и других 4 файлов, созданных Visual Studio.

                    Создать шаблон. Следуйте методу 7. Каждый раз, когда вы создаете проект с этим шаблоном, выберите x64 в главном меню графического интерфейса Visual Studio. Хорошая работа.

                    Затем загрузите SDL. Для Visual Studio загрузите библиотеку разработки "VC".


                    Извлеките файлы и переместите папку в свой проект.


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

                    Откройте свой проект и нажмите ALT + F7, чтобы открыть окно свойств.


                    Перейдите к каталогам VC++, выберите "включить каталоги" и выберите "Изменить".


                    Добавьте путь к папке include в исходной папке SDL. $(ProjectDir) заменяется путем к вашему файлу .vxproj. Ваш путь, скорее всего, будет отличаться от этого примера.


                    Нажмите OK, затем сделайте то же самое для каталогов библиотек. Добавьте сюда lib/x86 из исходной папки SDL.


                    Затем разверните параметры компоновщика и выберите ввод. Нажмите на дополнительные зависимости и выберите изменить.


                    Добавьте SDL2.lib и SDL2main.lib.


                    Далее перейдите в среду отладки и редактирования.


                    Добавьте эту команду. Используйте путь к папке lib/x86 в исходной папке SDL. Это позволяет вашей программе видеть библиотеки SDL во время выполнения. Чтобы запустить исполняемый файл самостоятельно, вы должны скопировать эти библиотеки в тот же каталог.


                    Наконец, перейдите в систему под компоновщиком. Изменить подсистему.



                    Теперь все готово. Для проверки добавьте файл .cpp с примером кода для урока 01.

                    Сценарий Premake для создания проектов Visual Studio для ioquake3

                    Эта фиксация не принадлежит ни к одной из веток в этом репозитории и может принадлежать ответвлению за пределами репозитория.

                    Последняя фиксация

                    Статистика Git

                    Файлы

                    Не удалось загрузить последнюю информацию о коммите.

                    README.md

                    Сценарий Premake для создания проектов Visual Studio для ioquake3.

                    ioquake3 использует MinGW для сборок Windows. В официальном репозитории есть проекты Visual Studio, но они не поддерживаются, являются неполными и часто ломаются.

                    screenshot

                    1. Обновите подмодули, чтобы получить SDL. обновление подмодуля git
                    2. Клонировать ioquake3 и этот репозиторий в один и тот же родительский каталог.
                    3. Запустите vs2017.bat или vs2019.bat .
                    4. Откройте build\vs201*\ioquake3.sln в Visual Studio и скомпилируйте.

                    Скомпилированные двоичные файлы записываются в build\vs201*\bin_* . Вы можете либо вручную скопировать их в каталог Quake 3 и запустить исполняемый файл ioquake3, либо прочитать раздел Отладка ioquake3 ниже.

                    В качестве альтернативы пакетным файлам вызовите premake напрямую с помощью premake5 [options] [action] , где [options] — одно или несколько из следующих значений, а [action] — vs2017 или vs2019.

                    Опция Описание
                    --disable-client Отключить проект ioquake3
                    --disable-server Отключить проект выделенного сервера
                    --disable-baseq3 Отключить проекты baseq3
                    --disable-missionpack Отключить проекты Missionpack< /td>
                    --disable-renderer-gl1 Отключить проект средства визуализации OpenGL 1
                    --disable -renderer-gl2 Отключить проект рендерера OpenGL 2
                    --disable-renderer-bgfx Отключить проект рендерера bgfx
                    --disable-game-dll Отключить проекты DLL игры
                    --disable -game-qvm Отключить проекты QVM игры
                    --disable-ogg Отключить поддержку Ogg Opus и Vorbis
                    --rename-baseq3=NAME Переименовать проект baseq3
                    --rename-missionpack= ИМЯ Переименуйте проект Missionpack
                    --standalone Удалите зависимость от Q3A
                    < /p>

                    Например, запустите premake5 --disable-baseq3 --disable-missionpack vs2017, если вам не нужны проекты игрового кода.

                    • fs_homepath — %APDDATA%\Quake3
                    • fs_basepath — тот же каталог, что и исполняемый файл ioquake3.
                    • fs_steampath — Steam Quake 3 (если есть).

                    ioq3-premake-msvc записывает скомпилированные двоичные файлы в build\vs201*\bin_* . Если у вас есть Steam-версия Quake 3, это не проблема — ioquake3 указывает fs_steampath на Steam, и вы можете запустить исполняемый файл ioquake3 из любого места. Если у вас есть розничная версия Quake 3, у вас есть несколько вариантов:

                    • Скопируйте каталог baseq3 Quake 3 в %APDDATA%\Quake3
                    • Скопируйте каталог baseq3 Quake 3 в build\vs201*\bin_* .
                    • Укажите fs_steampath в вашем каталоге Quake 3. Откройте свойства проекта ioquake3. Выберите «Отладка» и установите «Аргументы команды» на +set fs_steampath «путь» , где путь — это расположение вашей установки Quake 3, например. +set fs_steampath "D:\Games\Quake III Arena" .

                    Теперь вы сможете запускать ioquake3 с помощью отладчика Visual Studio.

                    Для отладки игрового кода добавьте в аргументы команды +set sv_pure 0 +set vm_cgame 0 +set vm_game 0 +set vm_ui 0.

                    Неофициальный рендерер, использующий bgfx, доступен здесь. Чтобы сгенерировать для него файл проекта, клонируйте его в тот же родительский каталог, что и ioquake3 и ioq3-premake-msvc, затем снова запустите premake. Выберите средство визуализации в игровой консоли с помощью cl_renderer bgfx (требуется vid_restart).

                    Читайте также: