C++ 1MIT осень 1 2021 — различия между версиями
(→Windows) |
(→Версии в тестирующей системе) |
||
(не показано 35 промежуточных версий 2 участников) | |||
Строка 41: | Строка 41: | ||
# Компилятор и стандартную библиотеку языка C++ (обычно идёт с компилятором). Один из: gcc, clang (проект LLVM), Visual C++ (ставится только в составе Visual Studio только под Windows), а лучше сразу все доступные. | # Компилятор и стандартную библиотеку языка C++ (обычно идёт с компилятором). Один из: gcc, clang (проект LLVM), Visual C++ (ставится только в составе Visual Studio только под Windows), а лучше сразу все доступные. | ||
+ | #* Также под Linux следует поставить инструмент Valgrind. Под Windows и macOS его нет. | ||
# Консольный клиент для системы контроля версий git и интерпретатор bash (sh и zsh не подойдут). | # Консольный клиент для системы контроля версий git и интерпретатор bash (sh и zsh не подойдут). | ||
− | # Систему сборки CMake. | + | # Интерпретатор языка Python (для запуска некоторых автоматических тестов). |
+ | # Систему сборки CMake. Если используете не Visual Studio — то ещё и систему сборки Make. | ||
# Среду разработки (Integrated Development Environment, IDE) или хотя бы редактор с подсветкой синтаксиса. | # Среду разработки (Integrated Development Environment, IDE) или хотя бы редактор с подсветкой синтаксиса. | ||
#* Самая мощная IDE — [https://www.jetbrains.com/ru-ru/clion/ CLion], под все ОС. Студенты могут получить полную версию бесплатно при помощи почты на <code>@edu.hse.ru</code>. | #* Самая мощная IDE — [https://www.jetbrains.com/ru-ru/clion/ CLion], под все ОС. Студенты могут получить полную версию бесплатно при помощи почты на <code>@edu.hse.ru</code>. | ||
Строка 49: | Строка 51: | ||
# Инструменты от проекта LLVM: clang-format, clang-tidy. | # Инструменты от проекта LLVM: clang-format, clang-tidy. | ||
# Статический анализатор cppcheck. | # Статический анализатор cppcheck. | ||
− | # Библиотека Boost ( | + | # Библиотека Boost. |
+ | #* Обычно заголовки (включая нужные нам библиотеки Asio и DLL) ставятся все одновременно. | ||
+ | #* Также требуется поставить как минимум библиотеки Filesystem и System (но при возможности лучше поставить просто всё сразу). | ||
# Если у вас не Ubuntu 20.04 — виртуальную машину с Ubuntu 20.04 или, на Windows, Windows Subsystem for Linux (WSL). Чтобы можно было поставить ровно такую же среду, как в тестирующей системе. | # Если у вас не Ubuntu 20.04 — виртуальную машину с Ubuntu 20.04 или, на Windows, Windows Subsystem for Linux (WSL). Чтобы можно было поставить ровно такую же среду, как в тестирующей системе. | ||
# Если вы хотите, можете бесплатно поставить Windows 10 в виртуальной машине [https://developer.microsoft.com/en-us/windows/downloads/virtual-machines/ с официального сайта] внутрь VirtualBox. Она живёт месяц-другой и дальше её надо скачать заново и переустановить. | # Если вы хотите, можете бесплатно поставить Windows 10 в виртуальной машине [https://developer.microsoft.com/en-us/windows/downloads/virtual-machines/ с официального сайта] внутрь VirtualBox. Она живёт месяц-другой и дальше её надо скачать заново и переустановить. | ||
=== Версии в тестирующей системе === | === Версии в тестирующей системе === | ||
− | Мы ориентируемся на последние стабильные версии софта, доступные в стандартных репозиториях Ubuntu 20.04 и Windows 10. | + | Мы ориентируемся на последние стабильные 64-битные версии софта, доступные в стандартных репозиториях Ubuntu 20.04 и Windows 10. |
Запуск команды с ключом <code>--version</code> должен выводить: | Запуск команды с ключом <code>--version</code> должен выводить: | ||
− | * GCC 10 (<code>g++</code>): <code>g++-10 (Ubuntu 10.3.0-1ubuntu1~20.04) 10.3.0</code> | + | # Компилятор C++: |
− | * Clang 12 (<code>clang++</code>): <code>Ubuntu clang version 12.0.0-3ubuntu1~20.04.3</code> | + | #* GCC 10 (<code>g++</code>): <code>g++-10 (Ubuntu 10.3.0-1ubuntu1~20.04) 10.3.0</code> |
− | * CMake 3.15 или более новый (<code>cmake</code>): <code>cmake version 3.16.3</code> | + | #* Clang 12 (<code>clang++</code>): <code>Ubuntu clang version 12.0.0-3ubuntu1~20.04.3</code> |
− | * clang-format 12 (<code>clang-format</code>): <code>Ubuntu clang-format version 12.0.0-3ubuntu1~20.04.3</code> | + | #* Только под Windows: Visual Studio Community 2019 v16.11.2 (версия компилятора Visual C++ 19.29.30133) |
− | * clang-tidy 12.0.0 (<code>clang-tidy</code>): <code>LLVM version 12.0.0</code> | + | #* Только под Linux: Valgrind 3.15.0 или около того (<code>valgrind</code>): <code>valgrind-3.15.0</code> |
− | + | # Версии git и bash обычно неважны, достаточно даже версии bash 3.2# | |
− | + | # Python 3.8 или более новый (<code>python</code> или <code>python3</code>): <code>Python 3.8.10</code> | |
− | * | + | # CMake 3.15 или более новый (<code>cmake</code>): <code>cmake version 3.16.3</code> |
− | + | #* Например, на Windows стоит хотя бы CMake 3.21, чтобы можно было указать <code>CMAKE_TOOLCHAIN_FILE</code> не в командной строке, а через переменную среды | |
+ | # Версия среды разработки неважна, она используется только у вас локально. Рекомендуется брать последнюю. | ||
+ | # LLVM: | ||
+ | #* clang-format 12 (<code>clang-format</code>): <code>Ubuntu clang-format version 12.0.0-3ubuntu1~20.04.3</code> | ||
+ | #* clang-tidy 12.0.0 (<code>clang-tidy</code>): <code>LLVM version 12.0.0</code> | ||
+ | # Cppcheck 1.90 (<code>cppcheck</code>): <code>Cppcheck 1.90</code> | ||
+ | # Boost 1.71.0 в файле <code>boost/version.hpp</code> должен определять <code>BOOST_VERSION</code>, равный <code>107100</code> | ||
+ | #* При тестировании под Visual Studio может использоваться последний доступный Boost (1.75.0) | ||
Если версия не сошлась или команда отсутствует — попробуйте добавить в конце команды номер версии через дефис, например: <code>clang++-12</code>. | Если версия не сошлась или команда отсутствует — попробуйте добавить в конце команды номер версии через дефис, например: <code>clang++-12</code>. | ||
Строка 79: | Строка 90: | ||
int main() { | int main() { | ||
std::cout << "C++ " << __cplusplus << "\n"; | std::cout << "C++ " << __cplusplus << "\n"; | ||
+ | |||
+ | #if defined(__x86_64__) || defined(_WIN64) | ||
+ | std::cout << "64-bit\n"; | ||
+ | #else | ||
+ | std::cout << "32-bit\n"; | ||
+ | #endif | ||
std::cout << "Detecting compiler...\n"; | std::cout << "Detecting compiler...\n"; | ||
Строка 104: | Строка 121: | ||
</pre> | </pre> | ||
− | Всегда должно выводиться <code>C++ 201703</code>. Дальше: | + | Всегда должно выводиться <code>C++ 201703</code> и <code>64 bit</code>. Дальше: |
* Для GCC: <code>GNU C 10.3.0</code> и <code>GNU libstdc++ 20210408</code> | * Для GCC: <code>GNU C 10.3.0</code> и <code>GNU libstdc++ 20210408</code> | ||
Строка 115: | Строка 132: | ||
Если вы ставили виртуальную машину с Ubuntu 20.04 — повторите команды в ней, внутри виртуальной машины версии могут отличаться от версий в вашей основной ОС. | Если вы ставили виртуальную машину с Ubuntu 20.04 — повторите команды в ней, внутри виртуальной машины версии могут отличаться от версий в вашей основной ОС. | ||
+ | |||
+ | === Отладка проблем === | ||
+ | Если gcc/clang/clang-tidy не может найти стандартные заголовки — запустите их с ключом <code>-v</code>, чтобы посмотреть, какие используются пути. Проверьте версию. Например, если вы поставили себе <code>gcc-11</code> без <code>g++-11</code>, то clang может начать искать заголовки C++ у gcc 11, но их там нет. | ||
== Linux == | == Linux == | ||
Строка 127: | Строка 147: | ||
sudo apt install g++-10 clang-12 # Компиляторы | sudo apt install g++-10 clang-12 # Компиляторы | ||
sudo apt install git # Консольный клиент для git; bash уже стоит | sudo apt install git # Консольный клиент для git; bash уже стоит | ||
− | sudo apt install cmake # CMake | + | sudo apt install cmake make # CMake и Make |
# CLion можно поставить [https://www.jetbrains.com/ru-ru/clion/ с официального сайта] | # CLion можно поставить [https://www.jetbrains.com/ru-ru/clion/ с официального сайта] | ||
sudo apt install clang-format-12 clang-tidy-12 # Инструменты от LLVM | sudo apt install clang-format-12 clang-tidy-12 # Инструменты от LLVM | ||
sudo apt install cppcheck # Cppcheck | sudo apt install cppcheck # Cppcheck | ||
− | sudo apt install libboost-all-dev # Boost | + | sudo apt install libboost-all-dev # Boost, скомпилированный для работы с libstdc++ |
</pre> | </pre> | ||
Строка 156: | Строка 176: | ||
#* [https://visualstudio.microsoft.com/ru/thank-you-downloading-visual-studio/?sku=Community&rel=16 Visual Studio Community 2019] с Workload ("Рабочая нагрузка") "Desktop development with C++" ("Разработка классических приложений на C++"). В ней достаточно компонентов "MSVC v142 ... x86/64" ("MSVC версии 142 ... x86/64"), "Windows 10 SDK" ("Пакет SDK для Windows 10 ") и "C++ Address Sanitizer", но вы можете также добавить "C++ profiling tools" ("Средства профилирования C++", может помочь при поиске тормозов в программе), "IntelliCode". Также обязательно поставьте английский язык, а вот русский лучше удалить. | #* [https://visualstudio.microsoft.com/ru/thank-you-downloading-visual-studio/?sku=Community&rel=16 Visual Studio Community 2019] с Workload ("Рабочая нагрузка") "Desktop development with C++" ("Разработка классических приложений на C++"). В ней достаточно компонентов "MSVC v142 ... x86/64" ("MSVC версии 142 ... x86/64"), "Windows 10 SDK" ("Пакет SDK для Windows 10 ") и "C++ Address Sanitizer", но вы можете также добавить "C++ profiling tools" ("Средства профилирования C++", может помочь при поиске тормозов в программе), "IntelliCode". Также обязательно поставьте английский язык, а вот русский лучше удалить. | ||
#* Если поставили Visual Studio, то можно поставить ещё и Clang к нему [https://github.com/llvm/llvm-project/releases/download/llvmorg-12.0.0/LLVM-12.0.0-win64.exe по ссылкам с официального сайта], он будет использовать стандартную библиотеку от Visual Studio. Но тогда не получится компилировать с <code>libc++</code>. | #* Если поставили Visual Studio, то можно поставить ещё и Clang к нему [https://github.com/llvm/llvm-project/releases/download/llvmorg-12.0.0/LLVM-12.0.0-win64.exe по ссылкам с официального сайта], он будет использовать стандартную библиотеку от Visual Studio. Но тогда не получится компилировать с <code>libc++</code>. | ||
− | # Консольный клиент git ставится [https://git-scm.com/download/win с официального сайта]. В качестве редактора рекомендуется оставить блокнот или Nano. Не выбирайте Vim, если не знаете, что это. | + | # Консольный клиент git ставится [https://git-scm.com/download/win с официального сайта], в комплекте также включён git bash (он подойдёт). В качестве редактора рекомендуется оставить блокнот или Nano. Не выбирайте Vim, если не знаете, что это. |
# CMake ставится с [https://cmake.org/ официального сайта] | # CMake ставится с [https://cmake.org/ официального сайта] | ||
+ | #* make для GCC/Clang из msys2 ставится при помощи <code>pacman -S make</code> (генератор называется <code>"MSYS Makefiles"</code>). | ||
# В качестве среды разработки рекомендуется либо CLion, либо Visual Studio. | # В качестве среды разработки рекомендуется либо CLion, либо Visual Studio. | ||
# Инструменты от LLVM 12.0.0 ставятся по-разному, потому что им нужно понять, какую стандартную библиотеку использовать: | # Инструменты от LLVM 12.0.0 ставятся по-разному, потому что им нужно понять, какую стандартную библиотеку использовать: | ||
Строка 164: | Строка 185: | ||
# Cppcheck 1.90 [https://github.com/danmar/cppcheck/releases/download/1.90/cppcheck-1.90-x64-Setup.msi по ссылкам с официального сайта] | # Cppcheck 1.90 [https://github.com/danmar/cppcheck/releases/download/1.90/cppcheck-1.90-x64-Setup.msi по ссылкам с официального сайта] | ||
# Boost ставится в зависимости от компилятора: | # Boost ставится в зависимости от компилятора: | ||
− | #* Если у вас стоит msys2 — <code>pacman -S mingw-w64-x86_64-boost</code> (может установиться более новая версия) | + | #* Если у вас стоит msys2 — <code>pacman -S mingw-w64-x86_64-boost</code> (может установиться более новая версия, чем надо) — версия для использования с libstdc++ |
− | #* Если у вас стоит Visual Studio | + | #* Если у вас стоит Visual Studio, то у вас есть два способа: |
− | #** Configuration Properties > C/C++ > General > Additional Include Directories — полный путь до папки <code>boost_1_71_0</code> | + | #** Ручная установка (если вы собираетесь использовать консоль или CMake): |
− | #** Configuration Properties > Linker > Additional Library Directories — полный путь до папки <code>boost_1_71_0\ | + | #**# Установите [https://boostorg.jfrog.io/artifactory/main/release/1.71.0/binaries/boost_1_71_0-msvc-14.2-64.exe отсюда] (это 64-битная версия 1.71.0 для MSVC v142, это ABI, начиная с Visual Studio 2019) |
− | # В качестве виртуальной машины установите [https://docs.microsoft.com/ru-ru/windows/wsl/install-win10#manual-installation-steps Windows Subsystem for Linux] (вам достаточно шагов 1-3 "ручная установка") с Ubuntu | + | #**# Если делаете проект Visual Studio самостоятельно, добавьте в ему настройки: |
− | 20.04, чтобы можно было запускать Valgrind: <code>wsl --install -d Ubuntu-20.04</code>. Потом внутри Ubuntu 20.04 поставьте софт по инструкции выше. | + | #**#* Configuration Properties > C/C++ > General > Additional Include Directories — полный путь до папки <code>boost_1_71_0</code> |
+ | #**#* Configuration Properties > Linker > Additional Library Directories — полный путь до папки <code>boost_1_71_0\lib64-msvc-14.2</code> | ||
+ | #**# В переменную среды <code>PATH</code> добавьте полный путь до папки <code>boost_1_71_0\lib64-msvc-14.2</code> (в ней лежит куча <code>DLL</code>-файлов). Альтернатива при использовании CMake — добавить в CMake параметр <code> -DBoost_USE_STATIC_LIBS=ON</code> | ||
+ | #**# При использовании CMake, если не находит Boost или находит не ту версию — добавьте ему при первом запуске аргументы <code>-DBOOST_ROOT=путь-до-папки-boost_1_71_0</code>. | ||
+ | #** Установка через NuGet (если вы собираетесь использовать только графический интерфейс): | ||
+ | #**# Для каждого проекта нажмите References > Manage NuGet Dependencies > вкладка Browse. | ||
+ | #**# Найдите нужную для установки библиотеку. Вы можете поставить либо только определённые библиотеки для линковки (вроде <code>boost_filesystem-vc142</code>), либо все сразу (<code>boost-vc142</code>), либо только заголовки (<code>boost</code>, включено как зависимости у предыдущих опций). | ||
+ | #**# Выберите версию <code>1.71.0</code> и нажмите Install. | ||
+ | #**# Дождитесь надписи <code>========== Finished ==========</code> в выводе <code>Package Manager</code>, это может занять несколько минут даже на быстром интернете при установке только одной библиотеки. | ||
+ | #**# Добавленные библиотеки перечислены в новом файле <code>packages.json</code> в проекте. | ||
+ | # В качестве виртуальной машины установите [https://docs.microsoft.com/ru-ru/windows/wsl/install-win10#manual-installation-steps Windows Subsystem for Linux] (вам достаточно шагов 1-3 "ручная установка") с Ubuntu 20.04, чтобы можно было запускать Valgrind: <code>wsl --install -d Ubuntu-20.04</code>. Потом внутри Ubuntu 20.04 поставьте софт по инструкции выше. | ||
Добавьте все инструменты [https://nicothin.pro/page/windows-path в переменную среды PATH]. Например, для msys2 наверняка будет нужна папка вроде <code>C:\msys239\mingw64\bin\</code> — именно в ней лежит <code>g++.exe</code> (проверьте!). После этого перезапустите консоль/CLion, чтобы они прочитали новую версию PATH. | Добавьте все инструменты [https://nicothin.pro/page/windows-path в переменную среды PATH]. Например, для msys2 наверняка будет нужна папка вроде <code>C:\msys239\mingw64\bin\</code> — именно в ней лежит <code>g++.exe</code> (проверьте!). После этого перезапустите консоль/CLion, чтобы они прочитали новую версию PATH. | ||
Компилятор Clang будет поставлен вместе с инструментам для LLVM и должен начать автоматически использовать соответствующую стандартную библиотеку: GNU libstdc++, если вы ставили через msys2 (можно доставить LLVM libc++), и Microsoft STL, если вы ставили с официального сайта рядом с Visual Studio. | Компилятор Clang будет поставлен вместе с инструментам для LLVM и должен начать автоматически использовать соответствующую стандартную библиотеку: GNU libstdc++, если вы ставили через msys2 (можно доставить LLVM libc++), и Microsoft STL, если вы ставили с официального сайта рядом с Visual Studio. | ||
+ | |||
+ | Осторожно: [https://stackoverflow.com/questions/46460771/why-does-running-main-in-powershell-open-my-mouse-properties не пишите <code>main</code> в PowerShell] | ||
== macOS == | == macOS == | ||
− | Будьте осторожны: обычно на macOS используется Apple Clang, который скрывается за командой <code>gcc</code> и ставится вместе с Xcode. Скорее всего, будет не та версия, что надо. | + | Будьте осторожны: обычно на macOS используется Apple Clang, который скрывается за командой <code>gcc</code> и ставится вместе с Xcode. Скорее всего, будет не та версия, что надо. Проверьте, запустив <code>g++ --version</code>. |
+ | |||
+ | При этом библиотеки для C++ (вроде Boost) надо либо собирать из исходников (долго и нудно), либо поставить уже собранные, но тогда они будут работать только с Apple Clang. | ||
Установите пакетный менеджер [https://brew.sh/ Homebrew]: запустите команду с домашней страницы и внимательно прочитайте, когда оно скажет <code>Run these two commands in your terminal</code>, эти команды необходимо выполнить. | Установите пакетный менеджер [https://brew.sh/ Homebrew]: запустите команду с домашней страницы и внимательно прочитайте, когда оно скажет <code>Run these two commands in your terminal</code>, эти команды необходимо выполнить. | ||
Строка 184: | Строка 219: | ||
<pre> | <pre> | ||
brew update # Обновление списка доступных пакетов | brew update # Обновление списка доступных пакетов | ||
− | brew install gcc@10 llvm@12 git cmake cppcheck | + | brew install gcc@10 llvm@12 git cmake make cppcheck # Установка gcc, clang и инструментов LLVM, git, cmake, make, cppcheck |
+ | brew install boost # Установка Boost для Apple Clang. С gcc/llvm clang будет странно не компилироваться и/или странно падать! | ||
</pre> | </pre> | ||
Строка 192: | Строка 228: | ||
Будет использоваться стандартная библиотека libc++, не stdlibc++. Из-за этого и говорят, что "на маках компилируется, а под другими ОС нет", виновата другая стандартная библиотека. | Будет использоваться стандартная библиотека libc++, не stdlibc++. Из-за этого и говорят, что "на маках компилируется, а под другими ОС нет", виновата другая стандартная библиотека. | ||
+ | |||
+ | Библиотека Boost может оказаться более новой версии, чем требуется. | ||
В качестве виртуальной машины, если у вас процессор Intel, проще всего поставить [https://www.virtualbox.org Oracle VirtualBox] и скачать в него [https://sourceforge.net/projects/osboxes/files/v/vb/55-U-u/20.04/20.04.3/Desktop/64bit.7z/download готовый образ с Ubuntu 20.04 от проекта OSboxes]. Дальше следуйте шагам по настройке Ubuntu 20.04. | В качестве виртуальной машины, если у вас процессор Intel, проще всего поставить [https://www.virtualbox.org Oracle VirtualBox] и скачать в него [https://sourceforge.net/projects/osboxes/files/v/vb/55-U-u/20.04/20.04.3/Desktop/64bit.7z/download готовый образ с Ubuntu 20.04 от проекта OSboxes]. Дальше следуйте шагам по настройке Ubuntu 20.04. | ||
Строка 289: | Строка 327: | ||
телега: @equivalence1 | телега: @equivalence1 | ||
− | = Проверка 3: | + | = Проверка 3: Шеин = |
Шеин Андрей | Шеин Андрей | ||
Текущая версия на 09:53, 12 декабря 2021
Содержание
Общее
На курсе используется C++17 или C17 в зависимости от ситуации. Нестандартные расширения, как правило, запрещены.
Честность в домашках
Весь код должен быть написан исключительно вами самостоятельно. Запрещается привлекать кого угодно для помощи с домашками, кроме лектора, практиков и проверяющих. Репетиторов тоже нельзя — лучше попросить дополнительную пару, это норм.
Запрещается публиковать или передавать за пределы вашего курса (или более старших курсов нашей программы) и условия, и решения задач. Если вам хочется что-то указать в резюме — вы можете кратко описать задание и свои успехи текстом. Пожалуйста, уважайте труд преподавателей: на разработку первой версии одного домашнего задания легко может уйти полная рабочая неделя в сорок часов, после чего задание каждый год улучшается в деталях.
Нарушения караются. Как минимум у всех участников (включая давшего списать, даже если случайно) полностью зануляется соответствующее задание. Сверх этого — по ситуации.
Можно и нужно обсуждать друг с другом и преподавателем:
- Содержимое лекций
- Не связанные с домашкой куски кода, вроде "нет ли UB в этой программе?" или "за сколько работает
vector::push_back
в каких случаях?" - Настройку среды разработки, запуск компиляторов
- Вопросы на StackOverflow
- Чисто алгоритмическую часть заданий, вообще не зависящую от языка программирования, вроде "какую структуру данных надо использовать, чтобы работало за линию вместо квадрата"
Следует спрашивать напрямую у своего практика (лектора, проверяющего — если практик недоступен), чтобы получить надёжную информацию:
- Вопросы по условию
- Подсказки
Нельзя обсуждать ни с кем, кроме лектора, практиков или проверяющих:
- Проблемы в своём конкретном коде
- Детали реализации алгоритмов, вроде "как лучше назвать эту переменную" или "какой инвариант тут лучше сделать"
Софт
Общее
Список
Независимо от ОС и среды разработки обязательно требуется работать с консолью, можете посмотреть вводную лекцию или часть курса на Stepik (от раздела 1.4 "Terminal: основы" до раздела 1.6 "Ввод / вывод" включительно): ОС много, сред разработки много, настроек много, а консоль очень похожа.
Рекомендуется ставить всё сразу на английском языке. Вся актуальная документация и форумы в основном только на английском. Преподаватели в основном работают с англоязычным софтом.
Рекомендуется ставить 64-битные версии.
Независимо от ОС потребуется поставить следующее, способ установки зависит от ОС. Всё это вместе даже без виртуальной машины легко займёт десяток гигабайт.
- Компилятор и стандартную библиотеку языка C++ (обычно идёт с компилятором). Один из: gcc, clang (проект LLVM), Visual C++ (ставится только в составе Visual Studio только под Windows), а лучше сразу все доступные.
- Также под Linux следует поставить инструмент Valgrind. Под Windows и macOS его нет.
- Консольный клиент для системы контроля версий git и интерпретатор bash (sh и zsh не подойдут).
- Интерпретатор языка Python (для запуска некоторых автоматических тестов).
- Систему сборки CMake. Если используете не Visual Studio — то ещё и систему сборки Make.
- Среду разработки (Integrated Development Environment, IDE) или хотя бы редактор с подсветкой синтаксиса.
- Самая мощная IDE — CLion, под все ОС. Студенты могут получить полную версию бесплатно при помощи почты на
@edu.hse.ru
. - Другая самая мощная IDE — Visual Studio. Только под Windows, только вместе с компилятором Visual C++.
- Популярные редакторы: Visual Studio Code (кроссплатформенный, не путать с Visual Studio), Sublime Text (платный), vim (сложный). У каждого свои приколы.
- Самая мощная IDE — CLion, под все ОС. Студенты могут получить полную версию бесплатно при помощи почты на
- Инструменты от проекта LLVM: clang-format, clang-tidy.
- Статический анализатор cppcheck.
- Библиотека Boost.
- Обычно заголовки (включая нужные нам библиотеки Asio и DLL) ставятся все одновременно.
- Также требуется поставить как минимум библиотеки Filesystem и System (но при возможности лучше поставить просто всё сразу).
- Если у вас не Ubuntu 20.04 — виртуальную машину с Ubuntu 20.04 или, на Windows, Windows Subsystem for Linux (WSL). Чтобы можно было поставить ровно такую же среду, как в тестирующей системе.
- Если вы хотите, можете бесплатно поставить Windows 10 в виртуальной машине с официального сайта внутрь VirtualBox. Она живёт месяц-другой и дальше её надо скачать заново и переустановить.
Версии в тестирующей системе
Мы ориентируемся на последние стабильные 64-битные версии софта, доступные в стандартных репозиториях Ubuntu 20.04 и Windows 10.
Запуск команды с ключом --version
должен выводить:
- Компилятор C++:
- GCC 10 (
g++
):g++-10 (Ubuntu 10.3.0-1ubuntu1~20.04) 10.3.0
- Clang 12 (
clang++
):Ubuntu clang version 12.0.0-3ubuntu1~20.04.3
- Только под Windows: Visual Studio Community 2019 v16.11.2 (версия компилятора Visual C++ 19.29.30133)
- Только под Linux: Valgrind 3.15.0 или около того (
valgrind
):valgrind-3.15.0
- GCC 10 (
- Версии git и bash обычно неважны, достаточно даже версии bash 3.2#
- Python 3.8 или более новый (
python
илиpython3
):Python 3.8.10
- CMake 3.15 или более новый (
cmake
):cmake version 3.16.3
- Например, на Windows стоит хотя бы CMake 3.21, чтобы можно было указать
CMAKE_TOOLCHAIN_FILE
не в командной строке, а через переменную среды
- Например, на Windows стоит хотя бы CMake 3.21, чтобы можно было указать
- Версия среды разработки неважна, она используется только у вас локально. Рекомендуется брать последнюю.
- LLVM:
- clang-format 12 (
clang-format
):Ubuntu clang-format version 12.0.0-3ubuntu1~20.04.3
- clang-tidy 12.0.0 (
clang-tidy
):LLVM version 12.0.0
- clang-format 12 (
- Cppcheck 1.90 (
cppcheck
):Cppcheck 1.90
- Boost 1.71.0 в файле
boost/version.hpp
должен определятьBOOST_VERSION
, равный107100
- При тестировании под Visual Studio может использоваться последний доступный Boost (1.75.0)
Если версия не сошлась или команда отсутствует — попробуйте добавить в конце команды номер версии через дефис, например: clang++-12
.
Особенно важны точные версии для clang-format, clang-tidy, cppcheck. У остальных инструментов поведение между минорными версиями сильно не меняется.
Следующая программа в скомпилированном виде выводит версию компилятора и стандартной библиотеки:
#include <iostream> int main() { std::cout << "C++ " << __cplusplus << "\n"; #if defined(__x86_64__) || defined(_WIN64) std::cout << "64-bit\n"; #else std::cout << "32-bit\n"; #endif std::cout << "Detecting compiler...\n"; #if defined(__GNUC__) && !defined(__clang__) std::cout << "GNU C " << __GNUC__ << "." << __GNUC_MINOR__ << "." << __GNUC_PATCHLEVEL__ << "\n"; #endif #ifdef __clang__ std::cout << "LLVM clang " << __clang_version__ << "\n"; #endif #ifdef _MSC_VER std::cout << "Microsoft Visual C++ " << _MSC_VER << "\n"; #endif std::cout << "Detecting standard library...\n"; #ifdef __GLIBCXX__ std::cout << "GNU libstdc++: " << __GLIBCXX__ << "\n"; #endif #ifdef _LIBCPP_VERSION std::cout << "LLVM libc++: " << _LIBCPP_VERSION << "\n"; #endif #ifdef _MSVC_STL_VERSION std::cout << "Microsoft STL: " << _MSVC_STL_VERSION << " at " << _MSVC_STL_UPDATE << "\n"; #endif }
Всегда должно выводиться C++ 201703
и 64 bit
. Дальше:
- Для GCC:
GNU C 10.3.0
иGNU libstdc++ 20210408
- Для Clang:
LLVM clang 12.0.0
иGNU libstdc++ 20210408
- Для Clang с ключом
-stdlib=libc++
:LLVM clang 12.0.0
иLLVM libc++ 12000
- Для Visual Studio:
C++ 199711
даже при включённом C++17 (потому что нужна совместимость со старым кодом, но это можно настроить, нам не потребуется),Microsoft Visual C++ 1929
иMicrosoft STL 142 at 202104
Проверка установки
Проверьте версии софта по списку выше. Также убедитесь, что консольный клиент git у вас версии хотя бы 2.25
Если вы ставили виртуальную машину с Ubuntu 20.04 — повторите команды в ней, внутри виртуальной машины версии могут отличаться от версий в вашей основной ОС.
Отладка проблем
Если gcc/clang/clang-tidy не может найти стандартные заголовки — запустите их с ключом -v
, чтобы посмотреть, какие используются пути. Проверьте версию. Например, если вы поставили себе gcc-11
без g++-11
, то clang может начать искать заголовки C++ у gcc 11, но их там нет.
Linux
Ubuntu
Проверьте, что у вас действительно Ubuntu 20.04: команда cat /etc/lsb-release
должна вывести Ubuntu 20.04.3 LTS
, цифра 3 может быть поменьше.
Обновите всю систему до последней версии: sudo apt update && sudo apt upgrade
. Теперь версия должны быть Ubuntu 20.04.3 LTS
.
Дальше установите нужные пакеты:
sudo apt install g++-10 clang-12 # Компиляторы sudo apt install git # Консольный клиент для git; bash уже стоит sudo apt install cmake make # CMake и Make # CLion можно поставить [https://www.jetbrains.com/ru-ru/clion/ с официального сайта] sudo apt install clang-format-12 clang-tidy-12 # Инструменты от LLVM sudo apt install cppcheck # Cppcheck sudo apt install libboost-all-dev # Boost, скомпилированный для работы с libstdc++
Также поставьте стандартную библиотеку libc++:
sudo apt install libc++-12-dev libc++abi-12-dev
При работе из консоли всегда команды с суффиксом версии: g++-10
, clang++-12
, clang-format-12
, clang-tidy-12
. Пакеты и команды без суффикса, вроде g++
, могут относиться к старым версиям.
В частности, вам нужно корректно настроить вашу среду разработки (SDKs в CLion) и консольный CMake (при помощи параметра вроде -DCMAKE_CXX_COMPILER=g++-10
).
В качестве виртуальной машины для Windows рекомендуется поставить VirtualBox: sudo apt install virtualbox
.
Другие дистрибутивы Linux
Вы можете либо поставить виртуальную машину с Ubuntu, либо сделать Docker-контейнер на основе образа Ubuntu 20.04.
Для установки Windows без вариантов: только виртуальная машина, рекомендуется VirtualBox.
Windows
- В качестве компилятора вы можете поставить на выбор:
- GCC/Clang. Есть несколько сборок, рекомендуется msys2: установите msys2, после чего из консоли msys запустите команду
pacman -S mingw-w64-x86_64-gcc mingw-w64-x86_64-make
. Для Clang поставьтеpacman -S mingw-w64-x86_64-clang
, для libc++ поставьтеpacman -S mingw-w64-x86_64-libc++
. - Visual Studio Community 2019 с Workload ("Рабочая нагрузка") "Desktop development with C++" ("Разработка классических приложений на C++"). В ней достаточно компонентов "MSVC v142 ... x86/64" ("MSVC версии 142 ... x86/64"), "Windows 10 SDK" ("Пакет SDK для Windows 10 ") и "C++ Address Sanitizer", но вы можете также добавить "C++ profiling tools" ("Средства профилирования C++", может помочь при поиске тормозов в программе), "IntelliCode". Также обязательно поставьте английский язык, а вот русский лучше удалить.
- Если поставили Visual Studio, то можно поставить ещё и Clang к нему по ссылкам с официального сайта, он будет использовать стандартную библиотеку от Visual Studio. Но тогда не получится компилировать с
libc++
.
- GCC/Clang. Есть несколько сборок, рекомендуется msys2: установите msys2, после чего из консоли msys запустите команду
- Консольный клиент git ставится с официального сайта, в комплекте также включён git bash (он подойдёт). В качестве редактора рекомендуется оставить блокнот или Nano. Не выбирайте Vim, если не знаете, что это.
- CMake ставится с официального сайта
- make для GCC/Clang из msys2 ставится при помощи
pacman -S make
(генератор называется"MSYS Makefiles"
).
- make для GCC/Clang из msys2 ставится при помощи
- В качестве среды разработки рекомендуется либо CLion, либо Visual Studio.
- Инструменты от LLVM 12.0.0 ставятся по-разному, потому что им нужно понять, какую стандартную библиотеку использовать:
- Если у вас стоит msys2 —
pacman -S mingw-w64-x86_64-clang mingw-w64-x86_64-clang-tools-extra
- Если у вас стоит Visual Studio — по ссылкам с официального сайта
- Если у вас стоит msys2 —
- Cppcheck 1.90 по ссылкам с официального сайта
- Boost ставится в зависимости от компилятора:
- Если у вас стоит msys2 —
pacman -S mingw-w64-x86_64-boost
(может установиться более новая версия, чем надо) — версия для использования с libstdc++ - Если у вас стоит Visual Studio, то у вас есть два способа:
- Ручная установка (если вы собираетесь использовать консоль или CMake):
- Установите отсюда (это 64-битная версия 1.71.0 для MSVC v142, это ABI, начиная с Visual Studio 2019)
- Если делаете проект Visual Studio самостоятельно, добавьте в ему настройки:
- Configuration Properties > C/C++ > General > Additional Include Directories — полный путь до папки
boost_1_71_0
- Configuration Properties > Linker > Additional Library Directories — полный путь до папки
boost_1_71_0\lib64-msvc-14.2
- Configuration Properties > C/C++ > General > Additional Include Directories — полный путь до папки
- В переменную среды
PATH
добавьте полный путь до папкиboost_1_71_0\lib64-msvc-14.2
(в ней лежит кучаDLL
-файлов). Альтернатива при использовании CMake — добавить в CMake параметр-DBoost_USE_STATIC_LIBS=ON
- При использовании CMake, если не находит Boost или находит не ту версию — добавьте ему при первом запуске аргументы
-DBOOST_ROOT=путь-до-папки-boost_1_71_0
.
- Установка через NuGet (если вы собираетесь использовать только графический интерфейс):
- Для каждого проекта нажмите References > Manage NuGet Dependencies > вкладка Browse.
- Найдите нужную для установки библиотеку. Вы можете поставить либо только определённые библиотеки для линковки (вроде
boost_filesystem-vc142
), либо все сразу (boost-vc142
), либо только заголовки (boost
, включено как зависимости у предыдущих опций). - Выберите версию
1.71.0
и нажмите Install. - Дождитесь надписи
========== Finished ==========
в выводеPackage Manager
, это может занять несколько минут даже на быстром интернете при установке только одной библиотеки. - Добавленные библиотеки перечислены в новом файле
packages.json
в проекте.
- Ручная установка (если вы собираетесь использовать консоль или CMake):
- Если у вас стоит msys2 —
- В качестве виртуальной машины установите Windows Subsystem for Linux (вам достаточно шагов 1-3 "ручная установка") с Ubuntu 20.04, чтобы можно было запускать Valgrind:
wsl --install -d Ubuntu-20.04
. Потом внутри Ubuntu 20.04 поставьте софт по инструкции выше.
Добавьте все инструменты в переменную среды PATH. Например, для msys2 наверняка будет нужна папка вроде C:\msys239\mingw64\bin\
— именно в ней лежит g++.exe
(проверьте!). После этого перезапустите консоль/CLion, чтобы они прочитали новую версию PATH.
Компилятор Clang будет поставлен вместе с инструментам для LLVM и должен начать автоматически использовать соответствующую стандартную библиотеку: GNU libstdc++, если вы ставили через msys2 (можно доставить LLVM libc++), и Microsoft STL, если вы ставили с официального сайта рядом с Visual Studio.
Осторожно: не пишите main
в PowerShell
macOS
Будьте осторожны: обычно на macOS используется Apple Clang, который скрывается за командой gcc
и ставится вместе с Xcode. Скорее всего, будет не та версия, что надо. Проверьте, запустив g++ --version
.
При этом библиотеки для C++ (вроде Boost) надо либо собирать из исходников (долго и нудно), либо поставить уже собранные, но тогда они будут работать только с Apple Clang.
Установите пакетный менеджер Homebrew: запустите команду с домашней страницы и внимательно прочитайте, когда оно скажет Run these two commands in your terminal
, эти команды необходимо выполнить.
После чего выполните команды (после #
идёт комментарий):
brew update # Обновление списка доступных пакетов brew install gcc@10 llvm@12 git cmake make cppcheck # Установка gcc, clang и инструментов LLVM, git, cmake, make, cppcheck brew install boost # Установка Boost для Apple Clang. С gcc/llvm clang будет странно не компилироваться и/или странно падать!
Теперь у вас должны появиться команды cmake
и cppcheck
. Если они не появились — у вас не добавлен в переменную PATH
путь до папки с программами, поставленными через Brew. Вам нужно дописать в файл $HOME/.bash_profile
(для Bash) или $HOME/.zprofile
(для Zsh) строчки, которые выводит команда brew shellenv
. После этого переоткройте консоль/CLion, чтобы они увидели изменения.
Чтобы появились команды clang++
, g++
(которые конфликтуют со стандартными командами Xcode) и команды вроде clang-format
(они связаны с первыми), надо добавить в этот же файл в конце строчку export PATH="$(brew --prefix llvm)/bin":$PATH
. После этого переоткройте консоль/CLion, чтобы они увидели изменения.
Будет использоваться стандартная библиотека libc++, не stdlibc++. Из-за этого и говорят, что "на маках компилируется, а под другими ОС нет", виновата другая стандартная библиотека.
Библиотека Boost может оказаться более новой версии, чем требуется.
В качестве виртуальной машины, если у вас процессор Intel, проще всего поставить Oracle VirtualBox и скачать в него готовый образ с Ubuntu 20.04 от проекта OSboxes. Дальше следуйте шагам по настройке Ubuntu 20.04.
Для процессора M1 можно поставить виртуальную машину UTM и Windows for ARM, после чего поставить в неё Visual Studio по инструкции для Windows. Но это будет дико тормозить, так как Visual Studio есть только для x86, а на ARM будет эмуляция.
Сайты
- Pastebin — сюда можно скидывать длинные логи и файлы, всегда ставьте "Paste Exposure: Private"
- Godbolt — исследование различных версий компиляторов
- Wandbox — онлайн-компилятор, поддерживающий некоторые библиотеки и несколько файлов
- Cpp Insights — десахаризатор синтаксиса C++
Лекции
Лектор: Суворов Егор Федорович (egor_suvorov@mail.ru), в теме письма обязательно указывать [hse] [cpp]
и слово "вопрос", если там вопрос.
Также есть Telegram: yeputons
Базовые материалы
Материалы с лекций: https://github.com/hse-spb-2021-cpp/lectures
- Специализация "Искусство разработки на современном C++" на Coursera. Ближе всего идеологически, особенно в начале — начинается не с Си, а сразу с современного C++.
- Про зарезервированные имена в Си и C++ (нижние подчёркивания и не только): stackoverflow.com/a/228797/767632
- Детальный справочник по C++ (cppreference). Содержит сильно больше, чем надо в курсе. Лучше искать и читать понятные подмножества по конкретным темам вроде
std::sort
или member functions).- Некоторые темы могут проще описаны на cplusplus.com, но там больше ошибок и неточностей.
Просто хорошие учебники
Тут может быть другое изложение, другие примеры, не хватать большого количества деталей. Но базовая картинка должна сложиться такая же: язык один и тот же, стараемся использовать только общепринятые термины и явно подчёркивать отсебятину.
- Книга "Programming -- Principles and Practice Using C++" (2 издание) за авторством Bjarne Stroustroup (исходный создатель языка C++)
- Видеокурсы по C++ из Computer Science Center: первый семестр, второй семестр
Общее развитие
Обращайте внимание, для какого стандарта вы читаете рекомендации. Минимальный — C++11, C++03 — это совсем другой язык. Следующие огромные изменения ожидаются в C++20.
- ISO C++ Wiki
- C++ Core Guidelines
- GotW (Guru of the Week by Herb Sutter)
- TotW (Tips of the Week by Google)
- Что угодно от Scott Meyers
- Что угодно от Andrei Alexandrescu (скорее доклады, книги выходили до 2010 года)
- P1705R0 Enumerating Core Undefined Behavior — попытка перечислить хоть какие-то UB.
- More C++ Idioms Wikibook
- Серия докладов "Back to Basics" на CppCon: 2019, 2020
Дополнительные материалы
- Серия статей про детали базовых элементов C++ на русском (перегрузки, массивы, операторы...)
- Scott Meyers "Type Deduction and Why You Care" (видеодоклад)
- Получение доступа к приватным типам через друзей и шаблоны (пример кода)
- Klaus Iglberger "Back to Basics: Move Semantics (part 1 of 2)"
- Klaus Iglberger "Back to Basics: Move Semantics (part 2 of 2)"
- Черновик последней версии стандарта C++ (уже после C++20)
- UBBook от Дмитрия Свиридкина (сборник разных граблей)
C++20 и метапрограммирование
- Концепты в C++20
- SFINAE и member detection
- Доклад "Сериализация объектов с блэкджеком и метапрограммированием"
- Библиотека Boost.Hana для метапрограммирования
Практика 1: Суворов
Проверка 1: Анюшева
Анюшева Елена Батыровна
Telegram: @elena-anyusheva
Практика 2: Головчанская
Головчанская Юлия Игоревна
gol.ju@yandex.ru
Telegram: @golju
Презентации
Доклады
- Михаил Матросов — Спецификаторы, квалификаторы и шаблоны
- Михаил Матросов — Как объявить константу в C++?
Проверка 2: Рухлов
Рухлов Никита Николаевич
Telegram: @rukhlov_nn
Проверка 2: Самойлов
Самойлов Виктор Максимович
Telegram: @Atos1337
Практика 3: Кравченко
Кравченко Дима
телега: @equivalence1
Проверка 3: Шеин
Шеин Андрей
Telegram: @andreyshspb
Со мной можно на ТЫ
Практика 4: Соснин
Соснин Антон Алексеевич
antsosnin@yandex.ru
Telegram: @antonso
Проверка 4: Краско
Краско Евгений Сергеевич.
Почта: krasko.evgeniy@gmail.com, в теме письма обязательно укажите [hse] [cpp]
и слово "вопрос", если там вопрос.
Telegram: kraskoes
GitHub: krasko
Правила приема лаб:
- Исправлять можно любой балл, кроме нуля.
- За отлично сделанное со второй попытки задание всё равно можно получить полный балл.
- Гарантируется одна попытка на исправления после первого ревью; дальше - по ситуации (скорее всего, вторую попытку буду давать только в редких случаях).
- Если есть вопросы по замечаниям - отвечайте на гитхабе; если я после этого не отвечаю вам 24 часа - можно написать в телеграм.
Практика 5: Данковский
Данковский Даниил Андреевич alh45011@gmail.com Telegram: @alh45011
Проверка 5: Гулецкий
Артур Гулецкий.
Почта: hatless.fox@gmail.com, в теме письма обязательно указывать [hse] [cpp]
и слово "вопрос", если там вопрос.
Практика 6: Алфёров
Алфёров Василий Викторович
Телега: @vasiliyalferov
Почта: teaching@vasalf.net
Материалы практики: тык