Настройка и сборка в удаленной системе или подсистеме Windows для Linux
Благодаря поддержке в Visual Studio можно легко настраивать проекты и выполнять их сборку в Windows, WSL и удаленных системах. Действия по проекта в Windows, удаленной системе или WSL одинаковые. Однако несколько вариантов поведения характерны именно для удаленной разработки.
Поведение в сценариях удаленной копии
В локальных сценариях (включая WSL1) оценивает путь к исходному каталогу проекта, открытому в Visual Studio. В сценариях удаленной копии оценивает путь к исходному каталогу проекта в целевой системе, а не к исходному каталогу проекта на локальном компьютере.
Исходный каталог проекта в целевой системе определяется значением в карте поставщика удаленных параметров Visual Studio (по умолчанию — ). дополнительные сведения см. в записи в таблице в разделе .
Локальная папка для удаленного вывода
В сценариях удаленной копии требуется локальный каталог для копирования некоторых удаленных файлов, таких как файлы ответов API файлов CMake, или файлы сборки, если параметру в карте поставщика удаленных параметров Visual Studio присвоено значение . Эти файлы автоматически копируются в .
Вызов одной и той же предустановки настройки для Windows и WSL1
Если вы попытаетесь использовать одну и ту же предустановку в Windows и WSL1, появится сообщение об ошибке. Windows и WSL1 применяют файловую систему Windows, поэтому CMake попытается использовать один и тот же выходной каталог () для деревьев сборки Windows и WSL1.
Если вы хотите использовать одну и ту же предустановку с Windows и набором инструментов WSL1, создайте вторую предустановку настройки, которая наследует исходную предустановку и задает новое значение . В следующем примере можно использовать в Windows, а можно использовать в WSL1:
Примечание
В Visual Studio 2019 поддерживается только набор инструментов WSL1. Это поведение будет наблюдаться при каждом вызове в Windows и WSL.
Запуск CTest
поддерживает два параметра меню в Visual Studio 2019.
- Тестовая проверкаВыполните проекты CTest ( для командлета Project-Name > вызывает CTest и выполняет все тесты, связанные с активной предустановкой и предустановленной сборкой, без других аргументов, переданных в CTest.
- Тестовая проверкаЗапустите предустановку теста для конфигурепресет > , чтобы отобразить все предустановки тестов, связанные с предустановкой Active configure. Выбор одной предустановки теста аналогичен запуску из командной строки, где — имя выбранной предустановки теста. Этот параметр будет недоступен, если для активной предустановки конфигурации не определены предустановки тестов.
В Visual Studio 2019 обозреватель тестов не интегрирован с .
Еще пять формальных организационных структур
Обычно исходные файлы обычно помещаются в каталог src, заголовочные файлы помещаются в включаемый файл, сгенерированные объектные файлы помещаются в каталог сборки, а конечный выходной файл elf помещается в каталог bin, так что весь файл Структура понятнее. Давайте снова реорганизовать предыдущие файлы, Мы создаем новый CMakeLists.txt во внешнем каталоге, содержимое которого выглядит следующим образом:
Здесь появляется новая команда add_subdirectory (). Эта команда может добавить подкаталог для исходного файла в текущий проект и может указать промежуточное двоичное и целевое двоичные места хранения. Конкретное использование может быть Baidu. Здесь вы указываете, что каталог src хранит исходные файлы. Когда cmake выполняется, он переходит в каталог src и ищет CMakeLists.txt в каталоге src, поэтому в каталоге src также создается CMakeLists. TXT, содержание выглядит следующим образом,
Здесь появляется новый набор команд для определения переменных: EXECUTABLE_OUT_PATH и PROJECT_SOURCE_DIR являются предопределенными переменными, которые поставляются с CMake. Смысл заключается в следующем,
- EXECUTABLE_OUTPUT_PATH: расположение целевого двоичного исполняемого файла
- PROJECT_SOURCE_DIR: корневой каталог проекта
Следовательно, set означает установить местоположение файла elf в каталог bin в корневом каталоге проекта. (Cmake имеет много предопределенных переменных, вы можете найти детали в Интернете)
После добавления этих двух CMakeLists.txt общая файловая структура выглядит следующим образом: Давайте запустим cmake,Но на этот раз давайте переключимся на каталог сборки.И введите следующую команду, Makefile будет сгенерирован в каталоге сборки, затем запустите make в каталоге сборки, Запустите ok, затем перейдем в каталог bin, найдем, что main сгенерирован, и запустим тест, Тест в порядке!
Объясните, зачем запускать cmake в каталоге сборки? Как видно из предыдущих случаев, если вы этого не сделаете, сопровождающие файлы, сгенерированные средой выполнения cmake, будут смешаны с исходными файлами, что приведет к загрязнению структуры каталогов программы. Когда вы запустите cmake в каталоге сборки, сгенерированные Вложенные файлы останутся только в каталоге сборки. Если нам не нужны эти файлы, мы можем очистить каталог сборки напрямую, что очень удобно.
Другой способ написания: В предыдущем проекте использовались два файла CMakeLists.txt. Этот метод записи используется для решения ситуации, когда необходимо сгенерировать несколько файлов elf. Самый внешний файл CMakeLists.txt используется для управления глобальными объектами и использования add_subdirectory. Давайте добавим исходный каталог, в котором будет создан файл elf.
Если генерируется только один файл elf, в приведенном выше примере может использоваться только один файл CMakeLists.txt, а содержимое самого внешнего файла CMakeLists.txt можно изменить следующим образом:
В то же время удалите CMakeLists.txt в каталоге src.
Терминология
- Файл служит скриптом (рецептом, сценарием) сборки проекта. Обычно один такой файл собирает все исходники в своём каталоге и в подкаталогах, при этом подкаталоги могут содержать, а могут не содержать дочерние файлы . С точки зрения IDE, таких как CLion или Visual Studio, файл также служит проектом, с которым работает программист внутри IDE.
- В cmake есть “цель” (“target”) — компонент, который следует собрать. Компонент может быть исполняемым файлом, так и статической либо динамической библиотекой.
- В cmake есть “проект” (“project”) — это набор компонентов, по смыслу похожий на Solution в Visual Studio.
- В cmake есть “флаги” (flags) — это аргументы командной строки для компилятора, компоновщика и других утилит, вызываемых при сборке.
- В cmake есть переменные, и в процессе интерпретации файла система сборки cmake вычисляет ряд встроенных переменных для каждой цели, тем самым получая флаги. Затем cmake создаёт вторичный скрипт сборки, который будет напрямую вызывать компилятор, компоновщик и другие утилиты с вычисленными флагами.
Контроль кода
Если вы хотите добавить все исходные файлы из каталога ./pbase/src в проект, вы можете использовать aux_source_directory, чтобы добавить исходные файлы из каталога в переменную, и позже вы можете использовать код, представленный этой переменной, например:
Добавьте заголовочный файл, включающий каталог:
Но файлы в include_directories не будут отражены в первом проекте Visual Studio, а aux_source_directory будет только добавлять исходные файлы и игнорировать файлы заголовков. Если проект Visual Studio, который вы хотите сохранить, также содержит файлы заголовков, вы можете сделать это:
Если вы хотите пережить фильтр в visual studio, вы можете использовать source_group:
Стандартный шаблон для добавления файла заголовка в проект:
main.cpp
Otherwise, writing the first HelloWorld will be a similar development under Qt Creator.
#include <QtWidgets/QApplication> #include <QtWidgets/QWidget> #include <QtWidgets/QGridLayout> #include <QtWidgets/QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); QWidget widget; widget.resize(640, 480); widget.setWindowTitle("Hello, world!!!"); QGridLayout *gridLayout = new QGridLayout(&widget); QLabel * label = new QLabel("Hello, world!!!"); label->setAlignment(Qt::AlignVCenter | Qt::AlignHCenter); gridLayout->addWidget(label); widget.show(); return app.exec(); }
When developing under Qt Creator using the CMake build system, I did not like the fact that when you add files to a project, Qt Creator does not register them in CMakeLists.txt, that is, files are created but not included in the project. It also has a number of minor inconveniences, although IDE CLion is still far from convenient in working with very specific Qt functionality, at least take the auto-completion of Qt macros, automatically create the missing class members (variables and methods) for these macros, work with the designer, etc. .
Adding a Library (Step 2)¶
Now we will add a library to our project. This library will contain our own
implementation for computing the square root of a number. The executable can
then use this library instead of the standard square root function provided by
the compiler.
For this tutorial we will put the library into a subdirectory
called . This directory already contains a header file,
, and a source file . The source file has one
function called that provides similar functionality to the
compiler’s function.
Add the following one line file to the
directory:
add_library(MathFunctionsmysqrt.cxx)
To make use of the new library we will add an
call in the top-level file so that the library will get
built. We add the new library to the executable, and add as
an include directory so that the header file can be found. The
last few lines of the top-level file should now look like:
# add the MathFunctions library add_subdirectory(MathFunctions) # add the executable add_executable(Tutorialtutorial.cxx) target_link_libraries(TutorialPUBLICMathFunctions) # add the binary tree to the search path for include files # so that we will find TutorialConfig.h target_include_directories(TutorialPUBLIC "${PROJECT_BINARY_DIR}" "${PROJECT_SOURCE_DIR}/MathFunctions" )
Now let us make the MathFunctions library optional. While for the tutorial
there really isn’t any need to do so, for larger projects this is a common
occurrence. The first step is to add an option to the top-level
file.
option(USE_MYMATH"Use tutorial provided math implementation"ON) # configure a header file to pass some of the CMake settings # to the source code configure_file(TutorialConfig.h.inTutorialConfig.h)
This option will be displayed in the and
with a default value of ON that can be changed by the user. This setting will
be stored in the cache so that the user does not need to set the value each
time they run CMake on a build directory.
The next change is to make building and linking the MathFunctions library
conditional. To do this we change the end of the top-level
file to look like the following:
if(USE_MYMATH) add_subdirectory(MathFunctions) list(APPENDEXTRA_LIBSMathFunctions) list(APPENDEXTRA_INCLUDES"${PROJECT_SOURCE_DIR}/MathFunctions") endif() # add the executable add_executable(Tutorialtutorial.cxx) target_link_libraries(TutorialPUBLIC${EXTRA_LIBS}) # add the binary tree to the search path for include files # so that we will find TutorialConfig.h target_include_directories(TutorialPUBLIC "${PROJECT_BINARY_DIR}" ${EXTRA_INCLUDES} )
Note the use of the variable to collect up any optional
libraries to later be linked into the executable. The variable
is used similarly for optional header files. This is a
classic approach when dealing with many optional components, we will cover
the modern approach in the next step.
The corresponding changes to the source code are fairly straightforward.
First, in , include the header if we
need it:
#ifdef USE_MYMATH # include "MathFunctions.h" #endif
Then, in the same file, make control which square root
function is used:
#ifdef USE_MYMATH const double outputValue = mysqrt(inputValue); #else const double outputValue = sqrt(inputValue); #endif
Since the source code now requires we can add it to
with the following line:
#cmakedefine USE_MYMATH
Exercise: Why is it important that we configure
after the option for ? What would happen if we inverted the two?
Run the executable or the
to configure the project and then build it
with your chosen build tool. Then run the built Tutorial executable.
Now let’s update the value of . The easiest way is to use the
or if you’re
in the terminal. Or, alternatively, if you want to change the option from the
command-line, try:
cmake ../Step2 -DUSE_MYMATH=OFF
Rebuild and run the tutorial again.
Debug hello world
To run and debug your project, open and put a breakpoint on the line.
Then open the Command Palette (⇧⌘P (Windows, Linux Ctrl+Shift+P)) and run CMake: Debug. The debugger will stop on the line:
Go ahead and press F5 to continue.
You’ve now used the VS Code CMake Tools extension to use CMake to build and debug a C++ app on Ubuntu. The steps are the same for other platforms; the difference being how you install CMake and the compiler/debugger for the platform of your choice. For instructions on setting up compilers/debuggers for other platforms, see the following:
- Microsoft C++ on Windows
- Clang on macOS
- GCC on Windows Subsystem for Linux
Настройка и сборка
Visual Studio предоставляет раскрывающиеся списки для целевых систем, настройки предустановок и сборки предустановок при включенной интеграции :
Выбор целевой системы
В раскрывающемся списке слева указывается активная целевая система. Это система, в которой CMake будет вызываться для настройки и сборки проекта. В этом раскрывающемся списке отображается локальный компьютер, все SSH-подключения в диспетчере подключений по имени узла, а также все установки подсистемы Windows для Linux (WSL), которые может найти Visual Studio:
В предшествующем примере:
- 192.168.0.5 — это удаленная система Linux, добавленная в диспетчер подключений.
- ubuntu2004 и debian — это установки WSL.
Выберите элемент Управление подключениями, чтобы открыть диспетчер подключений.
Выбор предустановки настройки
В раскрывающемся списке посередине можно выбрать активную предустановку настройки. Это значение , которое будет использоваться при вызове CMake для создания системы сборки проекта. В этом раскрывающемся списке приведены нескрытые предустановки настройки, определенные в файлах и .
Visual Studio использует значение в карте поставщика Microsoft Visual Studio Параметры для скрытия настроек, которые не применяются к активной целевой системе. дополнительные сведения см. в записи в таблице в разделе .
Выберите Управление конфигурациями , чтобы открыть файл, расположенный в корне проекта. Если не существует, он будет создан.
Выбор предустановки сборки
В раскрывающемся списке справа указывается активная предустановка сборки. Это значение , которое будет использоваться при вызове CMake для сборки проекта. В этом раскрывающемся списке приведены нескрытые предустановки сборки, определенные в файлах и .
Все предустановки сборки должны указывать связанное значение . Visual Studio скрывает предустановки сборки, которые не применяются к активной предустановке настройки. Дополнительные сведения см. в .
если нет предустановок сборки, связанных с активной предустановленной настройкой, Visual Studio перечисляет предустановку сборки по умолчанию. Предустановка сборки по умолчанию эквивалентна передаче без других аргументов из командной строки.
Configure
Visual Studio автоматически пытается настроить проект, когда обнаружит, что кэш CMake устарел. чтобы вручную вызвать конфигурацию, выберите Projectнастроить имя > проекта в главном меню. Это эквивалентно выполнению в командной строке, где — имя активной предустановки конфигурации.
Сведения об отключении автоматического создания кэша см. в разделе .
Сборка
Чтобы построить весь проект, выберите в главном меню Сборка собратьвсе . Это эквивалентно выполнению в командной строке, где — имя активной предустановки сборки.
Чтобы создать один целевой объект, переключитесь на представление целевых объектов CMake в Обозревателе решений. Затем щелкните правой кнопкой мыши любой целевой объект и выберите в контекстном меню пункт Сборка.
Примечание
Visual Studio 2019 не поддерживает параметр для создания подмножества целевых объектов, указанных в .
CMakeLists.txt
In CMakeLists.txt, in addition to the information added by default, you will need to add the search and connect Qt libraries by using the
find_package
and
target_link_libraries
functions.
cmake_minimum_required(VERSION 3.8) project(HelloWorld) set(CMAKE_CXX_STANDARD 17) # Include a library search using find_package() # via REQUIRED, specify that libraries are required find_package(Qt5Core REQUIRED) find_package(Qt5Gui REQUIRED) find_package(Qt5Widgets REQUIRED) set(SOURCE_FILES main.cpp) add_executable(HelloWorld ${SOURCE_FILES}) # specify which libraries to connect target_link_libraries(${PROJECT_NAME} Qt5::Core) target_link_libraries(${PROJECT_NAME} Qt5::Gui) target_link_libraries(${PROJECT_NAME} Qt5::Widgets)
Дополнительные параметры
Генератор CMake
Соответствует generator. Карты параметру cmak и указывает используемый . Это свойство можно также использовать как макрос , чтобы задать другие значения свойств. Сейчас Visual Studio поддерживает следующие генераторы CMake:
- Ninja
- «Unix Makefiles»
- «Visual Studio 16 2019»
- «Visual Studio 16 2019 Win64»
- «Visual Studio 16 2019 ARM»
- Visual Studio 15 2017
- Visual Studio 15 2017 Win64
- Visual Studio 15 2017 ARM
- Visual Studio 14 2015
- Visual Studio 14 2015 Win64
- Visual Studio 14 2015 ARM
Так как генератор Ninja предназначен для ускорения сборки в ущерб гибкости и функциональности, он используется по умолчанию. Однако некоторые проекты CMake могут быть неспособны использовать Ninja правильно. В этом случае можно указать CMake, что необходимо создать проект Visual Studio.
Режим IntelliSense
Режим, используемый подсистемой IntelliSense. если режим не выбран, Visual Studio наследует режим от указанного набора инструментов.
Исполняемый файл CMake
Полный путь к исполняемому файлу программы CMake, включая имя файла и расширение. Позволяет использовать настраиваемую версию CMake с Visual Studio. Для удаленных сборок укажите расположение CMake на удаленном компьютере.
Для таких конфигураций, как Linux, которые используют удаленные сборки, также доступны следующие параметры:
Удаленное копирование источников
Указывает, следует ли копировать исходные файлы на удаленный компьютер, и позволяет указать, следует ли использовать rsync или sftp.
Установка Строить Переменные
Программные проекты часто требуют установки переменных в командной строке при вызове CMake.Некоторые из наиболее часто используемых переменных CMake перечислены в таблице ниже:
Variable |
Meaning |
---|---|
Path to search for |
|
Путь для поиска дополнительных модулей CMake |
|
Конфигурация сборки, такая как или , определение флагов отладки / оптимизации. Это актуально только для систем сборки с одной конфигурацией, таких как и . Системы сборки с несколькими конфигурациями, такие как Visual Studio и Xcode, игнорируют этот параметр. |
|
Местоположение для установки программного обеспечения с целью сборки |
|
Файл, содержащий данные кросс-компиляции, такие как . |
|
ли создавать общие вместо статических библиотек для команд add_library (), используемых без типа |
|
Создайте файл для использования с инструментами на основе clang |
Для управления сборками могут быть доступны и другие специфические для проекта переменные,такие как включение или выключение компонентов проекта.
CMake не предоставляет соглашения о том, как такие переменные именуются между различными предоставленными системами сборки, за исключением того, что переменные с префиксом обычно относятся к параметрам, предоставляемым самим CMake, и не должны использоваться в сторонних параметрах, которые должны использовать свой собственный префикс. вместо. Инструмент может отображать параметры в группах, определяемых их префиксом, поэтому третьим лицам имеет смысл убедиться, что они используют самосогласованный префикс.
Установка переменных в командной строке
Переменные CMake могут быть установлены в командной строке либо при создании исходной сборки:
$ mkdir build $ cd build $ cmake .. -G Ninja -DCMAKE_BUILD_TYPE=Debug
или позже при последующем вызове :
$ cd build $ cmake . -DCMAKE_BUILD_TYPE=Debug
флаг может быть использован для неустановленных переменных на командной строке:
$ cd build $ cmake . -UMyPackage_DIR
Систему сборки CMake, которая изначально была создана в командной строке, можно изменить с помощью и наоборот.
Инструмент позволяет указать файл, который будет использоваться для заполнения начального кеша, с помощью параметра . Это может быть полезно для упрощения команд и сценариев, которым постоянно требуются одни и те же записи в кэше.
Установка переменных с помощью cmake-gui
Переменные могут быть заданы в cmake-gui с помощью кнопки «Add Entry».Это вызывает новое диалоговое окно для установки значения переменной.
Основной вид пользовательского интерфейса можно использовать для редактирования существующих переменных.
Кэш CMake
При выполнении CMake необходимо найти места расположения компиляторов,инструментов и зависимостей.Он также должен быть способен последовательно воссоздавать систему сборки,чтобы использовать одни и те же флаги компиляции/ссылки и пути к зависимостям.Такие параметры также должны быть настраиваемыми пользователем,поскольку это пути и опции,специфичные для пользовательской системы.
При первом CMake создает файл CMakeCache.txt в каталоге сборки, содержащий пары ключ-значение для таких артефактов. Пользователь может просмотреть или отредактировать файл кеша, инструмент или ccmake (1) . Инструменты предоставляют интерактивный интерфейс для повторной настройки предоставленного программного обеспечения и повторного создания системы сборки, как это необходимо после редактирования кэшированных значений. Каждая запись кэша может иметь связанный с ней краткий справочный текст, который отображается в инструментах пользовательского интерфейса.
Записи кэша также могут иметь тип, указывающий, как они должны быть представлены в пользовательском интерфейсе. Например, запись в кэше типа может быть отредактирована с помощью флажка в пользовательском интерфейсе, можно редактировать в текстовом поле, а , аналогично , также должен обеспечивать способ поиска путей файловой системы с помощью файла. диалог. Запись типа может предоставлять ограниченный список допустимых значений, которые затем предоставляются в раскрывающемся меню в пользовательском интерфейсе (см. Свойство кэша ).
Файлы CMake, поставляемые с программным пакетом, также могут определять логические параметры переключения с помощью команды . Команда создает запись кэша, содержащую текст справки и значение по умолчанию. Такие записи кэша обычно относятся к предоставленному программному обеспечению и влияют на конфигурацию сборки, например, создаются ли тесты и примеры, нужно ли создавать с включенными исключениями и т. Д.
Build a Project¶
CMake provides a command-line signature to build an already-generated
project binary tree:
cmake --build <dir> <options> -- <build-tool-options> cmake --build --preset <preset> <options> -- <build-tool-options>
This abstracts a native build tool’s command-line interface with the
following options:
-
Project binary directory to be built. This is required (unless a preset
is specified) and must be first. - ,
-
Use a build preset to specify build options. The project binary directory
is inferred from the key. The current working directory
must contain CMake preset files.
See for more details. -
Lists the available build presets. The current working directory must
contain CMake preset files. -
The maximum number of concurrent processes to use when building.
If is omitted the native build tool’s default number is used.The environment variable, if set,
specifies a default parallel level when this option is not given.Some native build tools always build in parallel. The use of
value of can be used to limit to a single job. -
Build instead of the default target. Multiple targets may be
given, separated by spaces. -
For multi-configuration tools, choose configuration .
-
Build target first, then build.
(To clean only, use .) -
Ignored. Behavior is default in CMake >= 3.0.
-
Enable verbose output — if supported — including the build commands to be
executed.This option can be omitted if environment variable or
cached variable is set. -
Pass remaining options to the native tool.