Configure make install

2.1 Что такое цепочка кросс-компиляции

Разберитесь, что такое кросс-компиляция, а затем давайте посмотрим, что такое цепочка кросс-компиляции.

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

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

В то же время процесс компиляции является последовательным процессом, который должен включать порядок, в котором используются инструменты. Каждый инструмент соединен последовательно в соответствии с последовательностью, которая образует цепную структуру.

следовательно,Кросс-компиляция цепочкиЭто полный набор инструментов, состоящий из нескольких подинструментов, сформированных для компиляции программного кода кроссплатформенной архитектуры. В то же время он скрывает детали предварительной обработки, компиляции, сборки, компоновки и т. Д. Когда мы указываем исходный файл (.c), он автоматически вызывает различные подинструменты в соответствии с процессом компиляции и автоматически генерирует окончательный образ двоичной программы (.bin). ).

Примечание. Строго говоря, кросс-компилятор ссылается на кросс-компилированный gcc, но на самом деле для удобства мы часто говорим, что кросс-компилятор представляет собой цепочку кросс-инструментов. В этой статье не проводится различие между этими двумя понятиями, оба относятся к цепочке компиляции

4.3 Построение цепочки кросс-компиляции с нуля

Это наиболее сложный и трудоемкий процесс. В конце концов, чтобы создать такую ​​цепочку кросс-компиляции, вам необходимо хорошо понимать принцип встроенной компиляции. По крайней мере, вам нужно знать, куда обращаться, чтобы прочитать информацию в случае возникновения проблемы

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

Конечно, если он собран, он, безусловно, будет самым полезным. По крайней мере, процесс компиляции и зависимости относительно ясны. Детали, возможно, должны пройти через соответствующий протокол или стандарт, но, по крайней мере, скелет будет более понятным.

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

Чтобы помочь каждому построить цепочку кросс-компиляции, я написал сценарий, сгенерированный одним щелчком мыши (включая загрузку исходного кода и автоматическую компиляцию). Если вам не удалось создать его самостоятельно, вы можете попробовать этот сценарий, а затем сравнить, является ли ваш процесс согласованным и отличаются ли параметры. Возможно, это поможет вам преодолеть это препятствие:Подробное объяснение кросс-компиляции 3 Используйте скрипт для автоматической генерации цепочки кросс-компиляции

Формат

Makefile состоит из правил (rules).
Первым указывается название цели (target), затем зависимости (prerequisites)
и действие (recipe — набор действий/команд), которое нужно выполнить.

Зависимости нужны не всегда и указываются по необходимости. Для простоты на первом этапе можно
думать о зависимостях как о файлах, которые нужно проверить: если ни один не изменился — заново
компилировать не нужно.

Отступы по умолчанию нужно ставить табуляцией. Если хотите поменять на другой символ — задайте
.RECIPEPREFIX

На русский обычно переводят так

Типичное применение: какая-то зависимость изменилась → выполнятеся действие в результате которого
создаётся таргет файл.

Как и в статье

Configure, make, install

в примере выше используются стандартные цели (target)

Про опции -o и -c
читайте статью

«Компиляция в C++

Опция Назначение
-c Указывает компилятору не делать линковку и создавать .o файлы для каждого исходника
-o filename Меняет название output файла со стадартного на указанный
-S Directs the compiler to produce an assembly source file but not to assemble the program.

Если файл вам не нужен, например, вы просто хотите выполнить какие-то команды — можно
использовать .PHONY

Предисловие

Это краткое введение для новичков. В следующих разделах описывается, как настроить систему для кросскомпиляции, что означает создание двоичных файлов (исполняемых файлов) для платформы, отличной от той, которая используется для компиляции, напр., работающих под Linux и создающих исполняемые файлы Win32 (или для FreeBSD или Darwin и т.д.). В этом случае платформу, используемую для компиляции, обычно называют «хостом» (Linux в приведенном выше примере), а платформа, в которой вы хотите запускать созданные двоичные файлы, является вашей «целью» . FreePascal является компилятором и в основном преобразует исходный код в двоичные файлы (машинный язык). Эти двоичные файлы также содержат информацию о том, как операционная система запускает исполняемые файлы. Более того, двоичные файлы относятся к API-интерфейсам, предоставляемым конкретной операционной системой, поэтому для разных операционных систем необходима другая реализация нашей библиотеки времени выполнения. Следовательно, эти двоичные файлы являются специфичными для платформы. Сам FreePascal не нуждается в большой настройке. Он может создавать двоичные файлы для многих платформ. Таким образом, просто прикажите сделать это.

Создание проекта в Visual Studio 2017 или в более ранней версии

Чтобы создать новый проект в Visual Studio 2017 или более ранней версии, выберите меню Файл (File) → Создать (New) → Проект (Project). Появится диалоговое окно, которое выглядит примерно так:

Рисунок 6 – Диалоговое окно «Новый проект Visual Studio 2017»

Сначала убедитесь, что слева указан Visual C++. Если вы не видите Visual C++, возможно, вы забыли выбрать установку поддержку Desktop development with C++ при установке Visual Studio. В этом случае вернитесь к уроку «0.6 – Установка интегрированной среды разработки (IDE)» и переустановите Visual Studio, как было показано (примечание: вместо полной переустановки вы можете запустить установщик Visual Studio и изменить существующую установку, чтобы добавить поддержку C++).

Если вы используете Visual Studio 2017 v15.3 или новее, под Visual C++ выберите Windows Desktop, а затем выберите Windows Desktop Wizard в главном окне.

Если вы не видите вариант с Windows Desktop, возможно, вы используете старую версию Visual Studio. Отлично. Вместо этого выберите Win32, а затем Win32 Console Application в главном окне.

Внизу в поле Name введите название своей программы (замените существующее имя на HelloWorld). В поле Location вы можете при желании выбрать другое место для размещения вашего проекта. Пока подойдет и значение по умолчанию.

Нажмите ОК. Если вы используете старую версию Visual Studio, запустится мастер приложений Win32. Нажмите Next.

На этом этапе вы должны увидеть диалоговое окно мастера, которое выглядит примерно так (более старые версии Visual Studio используют другой стиль, но имеют большинство из тех же параметров):

Рисунок 7 – Мастер создания десктопного приложения Visual Studio 2017

Убедитесь, что вы сняли флажок Предкомпилированный заголовок (Precompiled Header).

Затем нажмите ОК или Finish. Теперь ваш проект создан!

Безопасность

JIT-компиляция в основном использует исполняемые данные и, таким образом, создает проблемы безопасности и возможные эксплойты.

Реализация JIT-компиляции состоит из компиляции исходного кода или байтового кода в машинный код и его выполнения. Обычно это выполняется непосредственно в памяти: JIT-компилятор выводит машинный код непосредственно в память и немедленно выполняет его, а не выводит на диск, а затем вызывает код как отдельную программу, как при обычной предварительной компиляции. В современных архитектурах это вызывает проблему из-за защиты исполняемого пространства : произвольная память не может быть выполнена, поскольку в противном случае существует потенциальная дыра в безопасности. Таким образом, память должна быть помечена как исполняемая; по соображениям безопасности это должно быть сделано после того, как код был записан в память и помечен как доступный только для чтения, поскольку доступная для записи / исполняемая память представляет собой дыру в безопасности (см. W ^ X ). Например, JIT-компилятор Firefox для Javascript представил эту защиту в выпускной версии Firefox 46.

JIT-распыление — это класс эксплойтов компьютерной безопасности, которые используют JIT-компиляцию для распыления кучи : полученная в результате память становится исполняемой, что позволяет использовать эксплойт, если выполнение может быть перемещено в кучу.

View Help¶

To print selected pages from the CMake documentation, use

cmake --help-<topic>

with one of the following options:

Print usage information and exit.

Usage describes the basic command line interface and its options.

Show program name/version banner and exit.

If a file is specified, the version is written into it.
The help is printed to a named <f>ile if given.

Print all help manuals and exit.

All manuals are printed in a human-readable text format.
The help is printed to a named <f>ile if given.

Print one help manual and exit.

The specified manual is printed in a human-readable text format.
The help is printed to a named <f>ile if given.

List help manuals available and exit.

The list contains all manuals for which help may be obtained by
using the option followed by a manual name.
The help is printed to a named <f>ile if given.

Print help for one command and exit.

The manual entry for is
printed in a human-readable text format.
The help is printed to a named <f>ile if given.

List commands with help available and exit.

The list contains all commands for which help may be obtained by
using the option followed by a command name.
The help is printed to a named <f>ile if given.

Print cmake-commands manual and exit.

The manual is printed in a
human-readable text format.
The help is printed to a named <f>ile if given.

Print help for one module and exit.

The manual entry for is printed
in a human-readable text format.
The help is printed to a named <f>ile if given.

List modules with help available and exit.

The list contains all modules for which help may be obtained by
using the option followed by a module name.
The help is printed to a named <f>ile if given.

Print cmake-modules manual and exit.

The manual is printed in a human-readable
text format.
The help is printed to a named <f>ile if given.

Print help for one policy and exit.

The manual entry for is
printed in a human-readable text format.
The help is printed to a named <f>ile if given.

List policies with help available and exit.

The list contains all policies for which help may be obtained by
using the option followed by a policy name.
The help is printed to a named <f>ile if given.

Print cmake-policies manual and exit.

The manual is printed in a
human-readable text format.
The help is printed to a named <f>ile if given.

Print help for one property and exit.

The manual entries for are
printed in a human-readable text format.
The help is printed to a named <f>ile if given.

List properties with help available and exit.

The list contains all properties for which help may be obtained by
using the option followed by a property name.
The help is printed to a named <f>ile if given.

Print cmake-properties manual and exit.

The manual is printed in a
human-readable text format.
The help is printed to a named <f>ile if given.

Print help for one variable and exit.

The manual entry for is
printed in a human-readable text format.
The help is printed to a named <f>ile if given.

List variables with help available and exit.

The list contains all variables for which help may be obtained by
using the option followed by a variable name.
The help is printed to a named <f>ile if given.

Print cmake-variables manual and exit.

The manual is printed in a
human-readable text format.
The help is printed to a named <f>ile if given.

To view the presets available for a project, use

Из Darwin на Windows, Linux и другие [OC]

Примеры установки кросскомпилятора:

$ fink install fpc-cross-i386-win32

или

$ fink install fpc-cross-arm-linux

Для компиляции используйте эти команды:

fpc -Pi386 -Twin32 FILENAME
fpc -Parm -Tlinux FILENAME

Эта команда дает список кросскомпиляторов:

$ fink list fpc-cross

Текущий (fpc 3.0.4) выдает :

fpc-cross-arm-gba
fpc-cross-arm-linux
fpc-cross-arm-nds
fpc-cross-arm-wince
fpc-cross-arm-armv4t-embedded
fpc-cross-arm-armv7m-embedded
fpc-cross-i386-darwin
fpc-cross-i386-freebsd
fpc-cross-i386-go32v2
fpc-cross-i386-linux
fpc-cross-i386-nativent
fpc-cross-i386-netbsd
fpc-cross-i386-solaris
fpc-cross-i386-win32
fpc-cross-i386-wince
fpc-cross-jvm-android
fpc-cross-jvm-java
fpc-cross-m68k-linux
fpc-cross-mipsel-linux
fpc-cross-powerpc-linux
fpc-cross-sparc-linux
fpc-cross-x86-64-dragonfly
fpc-cross-x86-64-freebsd
fpc-cross-x86-64-linux
fpc-cross-x86-64-win64

Включение AddressSanitizer для Windows и Linux

Visual Studio поддерживает аддресссанитизер (асан), средство обнаружения ошибок памяти среды выполнения C и C++ для разработки как Windows, так и Linux. Параметр в включает аддресссанитизер. не поддерживает это поведение.

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

Следующий пример можно добавить в файл , чтобы включить или отключить AddressSanitizer для целевого объекта.

В части указаны другие флаги компиляции, например . Дополнительные сведения об AddressSanitizer для Linux см. в разделе, посвященном . дополнительные сведения об использовании аддресссанитизер с MSVC см. в разделе .

Передайте флаги среды выполнения в AddressSanitizer с помощью поля в . по умолчанию принимает значение , если не указаны другие параметры среды выполнения, поскольку LeakSanitizer не поддерживается в Visual Studio.

Вступление

Типичный компилятор выполняет следующие шаги:

  • Разбор: исходный текст преобразуется в абстрактное синтаксическое дерево (AST).
  • Разрешение ссылок на другие модули (C откладывает этот шаг до ссылки).
  • Семантическая проверка: отсеивание синтаксически правильных утверждений, которые не имеют смысла, например недоступный код или дубликаты объявлений.
  • Эквивалентные преобразования и оптимизация высокого уровня: AST преобразуется для представления более эффективных вычислений с той же семантикой. Это включает, например, раннее вычисление общих подвыражений и константных выражений, устраняя чрезмерные локальные назначения (см. также SSA ) и т. д.
  • Генерация кода: AST преобразуется в линейный низкоуровневый код с переходами, распределением регистров и т. П. Некоторые вызовы функций могут быть встроены на этом этапе, некоторые циклы развернуты и т.д.
  • Оптимизация глазка: низкоуровневый код сканируется для выявления простых локальных неэффективностей, которые устраняются.

Большинство современных компиляторов (например, gcc и clang) повторяют последние два шага еще раз. Они используют промежуточный низкоуровневый, но независимый от платформы язык для начальной генерации кода. Затем этот язык преобразуется в специфичный для платформы код (x86, ARM и т.д.), Что делает примерно то же самое оптимизированным для платформы способом. Это включает, например, использование векторных команд, когда это возможно, переупорядочение команд для повышения эффективности прогнозирования ветвлений и так далее.

После этого объектный код готов к связыванию. Большинство компиляторов нативного кода знают, как вызывать компоновщик для создания исполняемого файла, но сам по себе это не этап компиляции. В таких языках, как Java и C # ссылки могут быть полностью динамическими, что делается с помощью VM во время загрузки).

Условная компиляция

Директивы #if или #ifdef/#ifndef вместе с директивами #elif, #else и #endif управляют компиляцией частей исходного файла.
Если указанное выражение после #if имеет ненулевое значение, в записи преобразования сохраняется группа строк, следующая сразу за директивой #if. Синтаксис условной директивы следующий:

1234567

#if константное выражение   группа операций#elif константное выражение   группа операций#else   группа операций#endif

Отличие директив  #ifdef/#ifndef заключается в том, что константное выражение может быть задано только с помощью #define.
У каждой директивы #if в исходном файле должна быть соответствующая закрывающая директива #endif. Между директивами #if и #endif может располагаться любое количество директив #elif, однако допускается не более одной директивы #else. Директива #else, если присутствует, должна быть последней перед директивой #endif.

Пример

1234567891011121314151617

#include <stdio.h>#include <stdlib.h>#define P 2int main(){  system(«chcp 1251»);  system(«cls»);#if P==1  printf(«Выполняется ветка 1»);#elif P==2  printf(«Выполняется ветка 2, P=%d», P);#else  printf(«Выполняется другая ветка, P=%d», P);#endif  getchar();  return 0;}

Результат выполнения

Язык Си

Правильная установка(Вариант №2)

Быстрое создание deb-пакета «вручную».

Основное отличие от предыдущего способа заключается в том, что в данном случае вы создаете пакет вручную и отслеживаете все вносимые изменения. Так же этот способ подойдет вам, если исходники не поддерживают сборку пакета с checkinstall.

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

fakeroot
make install DESTDIR=`pwd`/tempinstall

Создадим в «корне пакета» директорию DEBIAN и сложим в DEBIAN/conffiles список всех файлов, которые должны попасть в /etc:

сd tempinstall
mkdir DEBIAN
find etc | sed "s/^/\//" > DEBIANconffiles

После чего создаём файл DEBIAN/control следующего содержания:

Package: имя_пакета
Version: 1.2.3
Architecture: amd64/i386/armel/all
Maintainer: Можете вписать своё имя, можете дребедень, но если оставить пустым, то dpkg будет ругаться
Depends: Тут можно вписать список пакетов через запятую.
Priority: optional
Description: Тоже надо что-нибудь вписать, чтобы не кидало предупреждения
  • При необходимости там же можно создать скрипты preinst, postinst, prerm и postrm.
  • Создаем deb-пакет, для чего выполняем:
dpkg -b tempinstall

Получаем на выходе tempinstall.deb, который и устанавливаем

sudo dpkg -i tempinstall.deb

Вступление

При работе с компьютером или сервером Linux большинство необходимых пакетов можно получить при помощи apt или другого менеджера пакетов. Но иногда нужен пакет или более современная версия программы, которых нет в репозиториях.

Данное руководство охватывает вопросы компиляции и установки cURL из исходного кода. Использованный здесь синтаксис применим на большинстве дистрибутивов.

Требования

Для компиляции исходного кода в Linux нужен пакет «build-essential» (в системах на основе Debian) или «Development Tools» (CentOS); данные пакеты содержат компиляторы и библиотеки gcc/g++.

Чтобы установить пакет на Debian и Ubuntu, используйте:

Для CentOS:

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

Перед компилированием cURL установите все необходимые зависимости. Также на используемом сервере нужно иметь привилегии root или sudo для установки и компилирования исходного кода.

Золотые правила разработки Make-файлов

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

Лучше всего начать работу с создания небольшого корректно работающего Make-файла и постепенно добавлять в него новые правила и зависимости. После добавления каждой инструкции вы должны тестировать корректность работы Make-файла, а не продолжать его модификацию. Таким образом вы будете точно знать, какая модификация Make-файла повлекла за собой появление ошибки. Пожалуйста помните о том, что команды из состава правила будут исполняться лишь при модификации целевых файлов, а не всех файлов с исходным кодом проекта.

Не пытайтесь использовать утилиту GNU Make в рамках крупного проекта, если вы все еще изучаете ее возможности; попробуйте внедрить ее в проекты меньшего масштаба перед тем, как начинать работу с более сложными проектами. И наконец, уясните, что переменные полезны и могут существенно сэкономить ваше время, поэтому вам определенно стоит использовать их всегда, когда это возможно.

А это пример практического использования сложного Make-файла в рамках программного проекта на языке C

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

Когда вы запустите Visual Studio 2019, вы должны увидеть диалоговое окно, которое выглядит следующим образом:

Рисунок 2 – Диалоговое окно «Начало работы» Visual Studio 2019

Выберите Создание проекта (Create a new project).

После этого вы увидите диалоговое окно, которое выглядит следующим образом:

Рисунок 3 – Visual Studio 2019: диалоговое окно создания нового проекта

Если вы уже открыли предыдущий проект, вы можете открыть это диалоговое окно через меню Файл (File) → Создать (New) → Проект (Project).

Выберите Мастер классических приложений Windows (Windows Desktop Wizard) и нажмите Далее (Next). Если вы этого не видите, то вы, вероятно, при установке Visual Studio забыли выбрать установку Desktop development with C++. В этом случае вернитесь к уроку «0.6 – Установка интегрированной среды разработки (IDE)» и переустановите Visual Studio, как было показано (примечание: вместо полной переустановки вы можете запустить установщик Visual Studio и изменить существующую установку, чтобы добавить поддержку C++).

Далее вы увидите диалоговое окно, которое выглядит следующим образом:

Рисунок 4 – Диалоговое окно настройки нового проекта Visual Studio 2019

Замените существующее имя проекта на HelloWorld.

Рекомендуется также установить флажок «Поместить решение и проект в одном каталоге» (Place solution and project in the same directory), поскольку это сокращает количество подкаталогов, создаваемых с каждым проектом.

Нажмите Создать (Create), чтобы продолжить.

Наконец, вы увидите последнее диалоговое окно:

Рисунок 5 – Диалоговое окно параметров проекта Visual Studio 2019

Убедитесь, что тип приложения установлен как Консольное приложение (.exe) (Console Application (.exe)), и что параметр Предкомпилированный заголовок (Precompiled Header) не выбран. Затем нажмите ОК.

Вы создали проект! Чтобы продолжить, перейдите в раздел ниже.

Компиляция

Процесс компиляции состоит из следующих этапов:

  1. Лексический анализ. Последовательность символов исходного файла преобразуется в последовательность лексем.
  2. Синтаксический анализ. Последовательность лексем преобразуется в дерево разбора.
  3. Семантический анализ. Дерево разбора обрабатывается с целью установления его семантики (смысла) — например, привязка идентификаторов к их декларациям, типам, проверка совместимости, определение типов выражений и т. д.
  4. Оптимизация. Выполняется удаление излишних конструкций и упрощение кода с сохранением его смысла.
  5. Генерация кода. Из промежуточного представления порождается объектный код.

Результатом компиляции является объектный код.

Объектный код — это программа на языке машинных кодов с частичным сохранением символьной информации, необходимой в процессе сборки.

При отладочной сборке возможно сохранение большого количества символьной информации (идентификаторов переменных, функций, а также типов).

Installing Exports¶

install(EXPORT<export-name>DESTINATION<dir>
NAMESPACE<namespace>|
PERMISSIONSpermissions...
CONFIGURATIONSDebug|Release|...]]
EXPORT_LINK_INTERFACE_LIBRARIES
COMPONENT<component>
EXCLUDE_FROM_ALL)
install(EXPORT_ANDROID_MK<export-name>DESTINATION<dir>)

The form generates and installs a CMake file containing code to
import targets from the installation tree into another project.
Target installations are associated with the export
using the option of the signature
documented above. The option will prepend to
the target names as they are written to the import file. By default
the generated file will be called but the
option may be used to specify a different name. The value given to
the option must be a file name with the extension.
If a option is given then the file will only be installed
when one of the named configurations is installed. Additionally, the
generated import file will reference only the matching target
configurations. The keyword, if
present, causes the contents of the properties matching
to be exported, when
policy is .

Note

The installed file may come with additional
per-configuration files to be loaded by
globbing. Do not use an export name that is the same as the package
name in combination with installing a
file or the latter may be incorrectly matched by the glob and loaded.

When a option is given, the listed implicitly
depends on all components mentioned in the export set. The exported
file will require each of the exported components to be
present in order for dependent projects to build properly. For example, a
project may define components and , with shared
libraries going into the component and static libraries and
headers going into the component. The export set would also
typically be part of the component, but it would export
targets from both the and components. Therefore,
the component would need to be installed if the
component was installed, but not vice versa. If the component
was installed without the component, dependent projects that try
to link against it would have build errors. Package managers, such as APT and
RPM, typically handle this by listing the component as a dependency
of the component in the package metadata, ensuring that the
library is always installed if the headers and CMake export file are present.

New in version 3.7: In addition to cmake language files, the mode maybe
used to specify an export to the android ndk build system. This mode
accepts the same options as the normal export mode. The Android
NDK supports the use of prebuilt libraries, both static and shared. This
allows cmake to build the libraries of a project and make them available
to an ndk build system complete with transitive dependencies, include flags
and defines required to use the libraries.

The form is useful to help outside projects use targets built
and installed by the current project. For example, the code

install(TARGETSmyexeEXPORTmyprojDESTINATIONbin)
install(EXPORTmyprojNAMESPACEmp_DESTINATIONlib/myproj)
install(EXPORT_ANDROID_MKmyprojDESTINATIONshare/ndk-modules)

will install the executable to and code to import
it in the file and
. An outside project
may load this file with the include command and reference the
executable from the installation tree using the imported target name
as if the target were built in its own tree.

Настройка и сборка

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 не поддерживает параметр для создания подмножества целевых объектов, указанных в .

Make

.cpp файлы компилируются в .o файлы

один .h файл может использоваться несколькими .cpp файлами

makefile

нужны для того чтобы печатать меньше названий файлов и опций вручную.

С их помощью можно делать build только тех файлов, которые изменились.

Make это инструмент, который вызывает компиллятор. Можно указать тот компиллятор
который нужен именно Вам.

С помощью инструкций в makefile можно указать какие именно файлы нужно
заново компилировать.

Рассмотрим пример из

C&plus;&plus;
.

В директории находятся три .cpp файла, два .h файла и три
.o файла, оставшиеся от прошлой компиляции.


  • Example.cpp
    ,

    Example.o

  • Second.cpp

    ,

    Second.h

    ,

    Second.o

  • Third.cpp

    ,

    Third.h

    ,

    Third.o

Все они нужны для проекта и не могут быть объединены в один файл.

Известно, что

Example.cpp

включает в себя файл

Second.h

и других зависимостей не имеет.

Мы хотим, чтобы при изменении самого

Example.cpp

либо его зависимости

Second.h

начиналась новая компиляция

Example.cpp

а затем новый

Example.o

линковался со старыми

Second.o

и

Third.o

Для этого напишем Makefile

aomake

Отступы нужно ставить табуляцией

Смотрим на последние две строки:

Если

Second.h

или

Example.cpp

(в который включен
Second.h)
изменились нужно компилировать файл

Example.cpp

после чего получается object файл

Example.o

и, как видно из первых двух строк — после обновления

Example.o

все object файлы линкуются.

Выигрыш в этой ситуации заключается
в том, что нам не нужно было перекомпилировать

Second.cpp

и

Third.cpp

мы просто перелинковали уже существующие

Second.o


Third.o

с новым

Example.o

Чтобы запустить этот файл нужно к команде
make добавить опцию f и название файла

make -f aomake

У файла

Second.cpp

две зависимости:

Second.h

и

Third.h

У файла

Third.cpp

только одна зависимость:

Third.h

Учтём эти зависимости в нашем

aomake

Ещё одной полезной опцией является j

make -j

-j — jobs Определяет число работ — jobs
(commands) которые запускаются
одновременно.

Если указано больше чем одна -j опция, то применяться будет последняя.

Если -j опция дана без аргументов
make не будет ограничивать количество работ запускаемых одновременно. То есть
запуститься сможет неограниченное количество работ одновременно.

Более подробную информацию по Makefile вы можете найти в статье

«makefile tutorial»

Заключение

Всегда июмейте всегда в виду, что некоторые языки программирования специально предназначены для компиляции кода, например, C. В то время как другие языки всегда должны интерпретироваться, например Java.

Для меня не имеет значения, скомпилировано что-то или интерпретировано, если оно может выполнить задачу эффективно.

Некоторые системы не предлагают технические условия для эффективного использования интерпретаторов. Поэтому вы должны запрограммировать их с помощью чего-то, что может быть непосредственно скомпилировано, например C. Иногда нужно выполнить вычисления настолько интенсивно, насколько это возможно. Например, при точном распознавании голоса роботом. В других случаях скорость или вычислительная мощность могут быть не столь критичными, и написать эмулятор на оригинальном языке может быть проще.

Сообщите мне, что бы вы предпочли: интерпретацию или компиляцию? Спасибо за уделенное время!

Пожалуйста, оставьте ваши комментарии по текущей теме статьи. Мы крайне благодарны вам за ваши комментарии, дизлайки, подписки, отклики, лайки!

Пожалуйста, оставляйте свои отзывы по текущей теме статьи. За комментарии, дизлайки, подписки, отклики, лайки огромное вам спасибо!

Вадим Дворниковавтор-переводчик статьи «Interpretation Versus Compilation»

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Все про сервера
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: