[Linux] — введение в использование инструментов разработки yum, vim, gcc, g++, gdb, make и makefile.

Оглавление

1. ням

1. Поймите, ням

(1)об/мин 

(2) ням  

2. Использование ням

(1) Просмотр пакетов программного обеспечения

(2) Установите программное обеспечение

(3) Удалите программное обеспечение

2. Редактор Linux-vim 

1. концепция vim

(1) Командный режим

(2) Режим вставки

(3) Режим нижнего ряда 

2.переключение режима vim

(1) Переключите командный режим на режим вставки.

(2) Переключить командный режим в режим нижней строки. 

(3) Переключите режим вставки и режим нижней строки в командный режим.

3. Работа в командном режиме

(1)Переместить

(2) Перелистывание страниц 

(3) Удалить

(4) Скопируйте и вставьте

(5) Вырезать

(6) Замена

(7) Отмена

(8)Изменить

(9) линия прыжка 

4. Работа в режиме нижнего ряда

(1) Перечислите номера строк

(2) Перейти на определенную строку

(3) Найти персонажей

(4) Копирование файлов

(5) Сохранить файл

(6) Выйти из vim 

5. Настройте vim

(1) Публичная конфигурация

(2) Частная конфигурация пользователя

3. Компилятор Linux-gcc/g++

1.функция gcc/g++

2.процесс компиляции gcc/g++

(1) Предварительная обработка — опция-Egenerate.i 

(2) Compile-option-S генерирует .s

(3) Вариант сборки-c генерирует .o

(4) Link-option-o создает исполняемую программу.

 3. Статические и динамические библиотеки.

(1) Статическая библиотека

(2) Динамическая библиотека 

4. отладка GDB

 1.Введение в GDB

 2.отладка GDB

(1) запущенная программа

(2) запустить программу запуска 

(3) Перечислите код

(4)b Установить точку останова

(5) отключить отключить точки останова

(6) delete удаляет точку останова

(7) info b для просмотра информации о точке останова.

(8) s выполняется оператор за оператором

(9) n попроцессное выполнение

(10) отображение отслеживания значений переменных

(11) undisplay отменяет отслеживание и отображает значения переменных.

(12) завершить функцию выхода

(13) информация для проверки того, какие точки останова установлены в данный момент.

(14) continue позволяет функции выполняться от текущей позиции до следующей точки останова.

(15) До перехода на определенную строку

(16) стек вызовов bt

 5. сделать/Makefile

1. Понимание make/Makefile 

(1)сделать 

(2)Makefile 

2. Как написать Makefile

 6. Апплет индикатора выполнения

1. Возврат каретки и перевод строки

2. Внедрить апплет индикатора выполнения 


1. ням

Обычно в Linux существует три типа установки программного обеспечения:

·  源码安装,下载源代码,编译好后,生成可执行文件进行安装(会有点麻烦,毕竟需要解决编译能否通过的问题)。

·  rpm安装,rpm已经编译好,打包好,直接安装即可

·  yum安装

1. Поймите, ням

В чем разница между вторым и третьим способами установки, описанными выше? 

(1)об/мин 

        Прежде чем понять yum, сначала разберитесь с RPM. RPM — это инструмент для упаковки и установки пакетов, загружаемых из Интернета в Linux. Он может упаковывать, устанавливать, запрашивать, обновлять, удалять, проверять базы данных и управлять ими. Приложение в пакете RPM, помимо дополнительных файлов, которые оно приносит для обеспечения своей нормальной работы, также нуждается в других файлах конкретной версии. Это отношение зависимости пакета программного обеспечения. Отношения зависимости между программами относительно сложны, и RPM не может решить эту проблему Зависимости пакетов. 

(2) ням  

        yum (Yellow Dog Updater, Modified) — это интерфейсный менеджер пакетов Shell, то есть клиент для установки программного обеспечения под Linux. Он может автоматически загружать пакеты RPM с сервера и устанавливать их. Он может автоматически разрешать зависимости пакетов, с которыми сталкиваются RPM и Once Установите все зависимые пакеты программного обеспечения без необходимости загружать и устанавливать их снова и снова. Вы можете более удобно добавлять, удалять и обновлять пакеты RPM, что упрощает управление обновлениями системы.

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

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

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

2. Использование ням

 yum необходимо загрузить пакет RPM и его зависимости с сервера, поэтому все операции должны выполняться онлайн. Вы можете использовать команду ping для проверки связи с Baidu, чтобы определить, подключены ли вы к Интернету. Если статус следующий, сеть в порядке:

И на одном сервере одновременно может быть установлено только одно программное обеспечение , поэтому вы можете устанавливать пакеты программного обеспечения только один за другим, используя yum.

(1) Просмотр пакетов программного обеспечения

Заказ:

yum list

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

 

Существует множество пакетов программного обеспечения, которые можно фильтровать, комбинируя команду grep:

Для списка ням:

·  软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构. 
·  "x86_64" 后缀表示64位系统的安装包, "i686" 后缀表示32位系统安装包. 选择包时要和系统匹配.
·  "el7" 表示操作系统发行版的版本. "el7" 表示的是 centos7/redhat7. "el6" 表示 centos6/redhat6.
·  最后一列, base 表示的是 "软件源" 的名称, 类似于 "小米应用商店", "华为应用商店" 这样的概念.

(2) Установите программное обеспечение

Для установки программного обеспечения необходимо установить программное обеспечение с правами root.

sudo yum install 软件名

sudo использует yum с правами root для установки программного обеспечения:

Если вы используете sudo для установки программного обеспечения, возникают следующие ситуации:

Это означает, что после создания пользователя delia соответствующие изменения в файле sudoers или файле группы отсутствуют. Вы можете изменить файл sudoers следующим образом:

①Откройте  файл /etc/sudoers от имени пользователя root.

②Добавьте  следующие строки:

Нажмите клавишу Esc еще раз, введите wq!, сохраните и выйдите. На данный момент можно выполнить команду установки yum.

Какая польза от установленного программного пакета lrzsz?

lrzsz — это программа, которая может заменить загрузку и загрузку файлов по FTP в Linux. Среди них rz и sz — инструменты командной строки для передачи файлов ZModem между Linux/Unix и Windows:

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

rz -E

нравиться: 

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

sz 文件名

 нравиться:

(3) Удалите программное обеспечение

 Чтобы удалить программное обеспечение, вам также необходимо выполнить команду удаления программного обеспечения с правами root:

sudo yum remove 软件名

Если вы хотите удалить программное обеспечение lrzsz, вам необходимо ввести «y» для подтверждения:

Сообщения «Успешно» и «Завершено» указывают на то, что удаление прошло успешно:

 

2. Редактор Linux-vim 

1. концепция vim

vim — это текстовый редактор, разработанный на основе vi, но vim — это обновленная версия vi. Он не только совместим со всеми инструкциями vi, но также имеет новые функции, такие как подсветка синтаксиса и визуальные операции. Его можно запускать не только в терминал, но также и в x. Работает в Windows, Mac OS и Windows.

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

(1) Командный режим

Управляйте перемещением экранного курсора, удалением символов, слов или строк, а также возможностью перемещения, копирования, вырезания и вставки текста.

(2) Режим вставки

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

(3) Режим нижнего ряда 

Сохранение файлов, выход из файлов, замена файлов, поиск строк, список номеров строк и другие операции. Вы можете использовать режимы помощи vim для просмотра всех режимов текущего vim.

2.переключение режима vim

Используйте команду:

vim 文件名

 например:

 Войдите в командный режим vim, который также является полноэкранным экраном редактирования:

Вы пока не можете редактировать файл file.c, потому что для редактирования файла вы должны находиться в режиме вставки. 

(1) Переключите командный режим на режим вставки.

Существует три типа переключения из командного режима в режим вставки: i, a и o:

i:从光标当前位置开始输入文件

a:从光标所在位置的下一个位置开始输入文字

o:插入新的一行,从行首开始输入文字

(2) Переключить командный режим в режим нижней строки. 

Введите английское двоеточие: 

:

(3) Переключите режим вставки и режим нижней строки в командный режим.

Введите клавишу Esc: 

Esc

3. Работа в командном режиме

После нажатия «Esc» и перехода в командный режим вы сможете выполнять следующие операции:

(1)Переместить

 Существует множество распространенных операций по перемещению курсора:

「h」:左
「l」:右
「k」:上
「j」:下
「^」:移动到光标所在行的“行首”
「$」:移动到光标所在行的“行尾”
「w」:光标跳到下个字的开头
「e」:光标跳到下个字的字尾
「b」:光标回到上个字的开头
「nl」:光标移到该行的第n个位置,如:5l,56l
[gg]:跳到第一行行首
「G」:跳到最后一行行首
[shift+g]:进入文本末端

(2) Перелистывание страниц 

 Переворачивание страниц имеет следующие общие операции: 

「ctrl+b」:上翻一页
「ctrl+f」:下翻一页
「ctrl+u」:上翻半页
「ctrl+d」:下翻半页

(3) Удалить

Существует несколько распространенных операций по удалению текста:

「x」:每按一次,删除光标所在位置的一个字符
「nx」:例如,「6x」表示删除光标所在位置的“后面(包含自己在内)”6个字符
「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符
「nX」:例如,「20X」表示删除光标所在位置的“前面”20个字符
「dd」:删除光标所在行
「ndd」:从光标所在行开始删除#行

(4) Скопируйте и вставьте

 Существует несколько распространенных операций копирования и вставки текста:

「yy」:复制光标所在行到缓冲区
「nyy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字
「yw」:复制将标所在之处到行尾的字符到缓冲区中
「nyw」:复制n个字符到缓冲区
「p」:将缓冲区内的字符粘贴到下一行
「np」:将缓冲区内的字符粘贴到下n行

注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能

(5) Вырезать

 Существует несколько распространенных операций по вырезанию текста: 

dd:剪切光标所在行
ndd:剪切从光标所在行开始往下的n行
p:将剪切的字符粘贴到下一行
np:将剪切的字符粘贴到下n行

(6) Замена

Существует несколько распространенных операций по замене текста: 

「r」:替换光标所在处的字符。
「R」:替换光标所到之处的字符,直到按下「ESC」键为止。

(7) Отмена

Отмена имеет следующие общие операции: 

「u」:误执行一个命令时,马上按「u」,回到上一个操作。按多次“u”可以执行多次恢复。
「ctrl + r」: 撤销恢复

(8)Изменить

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

「cw」:更改光标所在处的字到字尾处
「cnw」:例如,「c3w」表示更改3个字

(9) линия прыжка 

Линии перехода имеют следующие общие операции: 

「ctrl」+「g」列出光标所在行的行号。
「nG」:例如,「15G」,表示移动光标至文章的第15行行首

4. Работа в режиме нижнего ряда

 После нажатия «Esc» нажмите «:», чтобы войти в режим нижней строки, чтобы вы могли выполнять следующие операции:

(1) Перечислите номера строк

「set nu」:列出所有行行号
「set nonu」:隐藏所有行行号

(2) Перейти на определенную строку

「n」:n代表第n行,输入n,再按「enter」就跳转到第n行了

(3) Найти персонажей

「/字符」:先输入/,再输入字符,再按enter,就会高亮显示该字符,如查找到多个字符,可以按键盘「n」向后跳转,光标会处于查找之前的行
「?字符」:先输入?,再输入字符,再按enter,就会高亮显示该字符,如查找到多个字符,可以按键盘「n」向后跳转,光标会处于第一行行首

Отменить поиск, режим нижней строки:

:/nohl

(4) Копирование файлов

「vs 文件名」:双屏编辑同一文件
「ctrl+w+w」:光标在两个双屏文件中跳转

(5) Сохранить файл

「w」:在冒号后面输入w

(6) Выйти из vim 

「q」:退出
「q!」:强制退出vim
「wq」:保存后退出vim
「wq!」:保存后强制退出vim

5. Настройте vim

(1) Публичная конфигурация

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

/etc/vimrc 

Например, после переключения на root вы можете увидеть файл vimrc в /etc:

 

(2) Частная конфигурация пользователя

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

su 用户名
cd ~
vim .vimrc

В файле .vimrc можно настроить следующие параметры конфигурации:

syntax on  //设置语法高亮:
set nu     //显示行号:
set shiftwidth=4  //设置缩进的空格数为4

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

curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh

3. Компилятор Linux-gcc/g++

1.функция gcc/g++

 gcc и g++ — компиляторы языков программирования, разработанные GNU. Среди них gcc используется для компиляции программ на языке C, а g++ — для компиляции программ на C++. При составлении программы она проходит следующие четыре этапа:

  • Предварительная обработка (включая файлы заголовков, замену макросов, удаление комментариев, условную компиляцию, генерацию .i)
  • Компиляция (грамматический анализ, лексический анализ, семантический анализ, сводка символов, генерация.с)
  • Сборка (преобразование ассемблерного кода в машинные инструкции (двоичные инструкции), создание объектных файлов, формирование таблиц символов и создание .o)
  • Связывание (объединение таблиц сегментов, объединение и перемещение таблиц символов, создание исполняемых программ)

2.процесс компиляции gcc/g++

Используйте следующую команду для компиляции:

gcc 【选项]】 源文件 【选项】 目标文件

 Распространенные варианты:

-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
-S  编译到汇编语言不进行汇编和链接
-c  编译到目标代码
-o 文件输出到 文件
-static 此选项对生成的文件采用静态链接
-g 生成调试信息。GNU 调试器可利用该信息。
-shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
-O0
-O1
-O2
-O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-w  不生成任何警告信息。
-Wall 生成所有警告信息。

(1) Предварительная обработка — опция-Egenerate.i 

  • Функции предварительной обработки в основном включают определение макросов, включение файлов, условную компиляцию, удаление комментариев и т. д. Директивы предварительной обработки представляют собой строки кода, начинающиеся со знака #.
  • Опция «-E» заставляет gcc остановить процесс компиляции после предварительной обработки.
  • Опция «-o» относится к целевому файлу, а файл «.i» — это предварительно обработанная исходная программа C.

Для файла HelloWorld.c

#include<stdio.h>
#define NUMBER 2

int main()
{
#if NUMBER
        printf("NUMBER=%d\n",NUMBER);//NUMBER被定义,就打印NUMBER的值,否则打印error
#else
        printf("error");
#endif
        return 0;

}

Выполнение заказа: 

gcc -o HelloWorld.c -o HelloWorld.i

В результате будет создан файл HelloWorld.i.

(2) Compile-option-S генерирует .s

  • Этот процесс преобразует код C в ассемблер, включая: синтаксический анализ, лексический анализ, семантический анализ и сводку символов.
  •  Чтобы определить фактическую работу, которую должен выполнить код, gcc сначала проверяет код на стандартизацию, наличие грамматических ошибок и т. д. После проверки правильности gcc переводит код на язык ассемблера.
  • Для просмотра можно использовать параметр «-S». Этот параметр только компилируется без ассемблирования и генерирует ассемблерный код.
  • Опция «-o» относится к целевому файлу, а файл «.s» — это переведенная оригинальная программа C.

 Продолжайте выполнять следующие команды:

gcc -S HelloWorld.i -o HelloWorld.s

После создания файла HelloWorld.s введите ассемблерный код HelloWorld.s:

(3) Вариант сборки-c генерирует .o

  • Преобразование ассемблерного кода в машинные инструкции (двоичные инструкции), создание объектных файлов и формирование таблиц символов.
  • На этапе сборки файл «.s», созданный на этапе компиляции, преобразуется в целевой файл.
  • Используйте опцию «-c», чтобы увидеть, что ассемблерный код был преобразован в двоичный объектный код «.o».

Используйте следующую команду:

gcc -c HelloWorld.s -o HelloWorld.o

 Создайте файл HelloWorld.o. Поскольку файл .o является двоичным, он будет искажен, если cat:

(4) Link-option-o создает исполняемую программу.

  • Объединяйте таблицы сегментов, объединяйте и перемещайте таблицы символов.
  • После успешной компиляции наступает этап компоновки.

Выполните следующую команду:

gcc HelloWrld.o -o HelloWorld

 Создайте исполняемый файл HelloWorld и используйте команду cat для его просмотра:

 3. Статические и динамические библиотеки.

(1) Статическая библиотека

        Статическая библиотека означает, что при компиляции и компоновке весь код файла библиотеки добавляется в исполняемый файл, поэтому сгенерированный файл имеет относительно большой размер, но файл библиотеки больше не нужен во время выполнения. Суффикс обычно «.a».

优点:可移植性好

缺点:体积大

Сначала установите lib.c, используя следующую команду:

sudo yum install glibc-static

Затем используйте статическую компоновку для создания исполняемого файла:

gcc 源文件 -o 目标文件 -static

 нравиться:

(2) Динамическая библиотека 

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

优点:体积小,轻量,节省内存和硬盘空间,下载传输方便

缺点:库代码没了,程序无法运行

использовать

gcc  HelloWorld.c -o HelloWorld

 После генерации исполняемой программы:

Вы можете использовать команду

file 可执行文件名

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

4. отладка GDB

 1.Введение в GDB

gdb — мощный инструмент отладки программ под UNIX, выпущенный организацией GNU с открытым исходным кодом. Это инструмент отладки командной строки. Вообще говоря, gdb в основном выполняет следующие четыре функции:

  • Запустите программу и запускайте ее так, как вам нравится, в соответствии с вашими индивидуальными требованиями.
  • Позволяет отлаживаемой программе остановиться в указанной точке останова отладки. (Точки останова могут быть условными выражениями)
  • Когда программа остановлена, вы можете просмотреть, что происходит в программе в это время.
  • Динамическое изменение среды выполнения программы
Существует два способа выпуска программ: режим отладки и режим выпуска. По умолчанию используется режим выпуска для двоичных программ, скомпилированных Linux gcc/g++. Чтобы использовать отладку GDB, вы должны добавить опцию -g при создании двоичных программ из исходного кода:
gcc 源文件 -o 目标文件 -g

При этом создается отладочная версия исполняемой программы:

Вы можете использовать команду:

readelf -S 可执行文件 | grep -i debug

Просмотр отладочной информации.

Сравнивая исполняемые программы отладочной версии и релизной версии, обнаружено, что размер исполняемого программного файла отладочной версии больше, чем у релизной версии.Размер исполняемой программы отладочной версии составляет 10048B, а исполняемый файл размер программы релизной версии 10048B.8512B:

 

 Следовательно, также видно, что исполняемая программа , скомпилированная gcc/g++ , является релизной версией .

 2.отладка GDB

В качестве примера возьмем код сортировки вставкой InsertSort.c: 

#include<stdio.h>
#include <stdlib.h>

//打印
void Print(int* a, int n)
{
        for (int i = 0; i < n; i++)
        {
                printf("%d ", a[i]);
        }

        printf("\n");
}

//直接插入排序
void InsertSort(int* a, int n)
{
        //多趟排序
        for (int i = 0; i < n - 1; i++)
        {
                //把temp插入到数组的[0,end]有序区间中
                int end = i;
                int temp = a[end + 1];
                while (end >= 0)
                {
                        if (temp < a[end])
                        {
                                a[end + 1] = a[end];
                                end--;
                        }
                        else
                        {
                                break;
                        }
                }

                a[end + 1] = temp;

        }

}

void TestInsertSort()
{
        int arr[] = { 9,1,2,5,7,4,8,6,3,5 };
        InsertSort(arr, sizeof(arr) / sizeof(arr[0]));
        Print(arr, sizeof(arr)/sizeof(arr[0]));
}

int main()
{
        TestInsertSort();

        return 0;
}

 Приходите узнать об отладке GDB.

(1) запущенная программа

r/run:运行程序

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

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

 

(2) запустить программу запуска 

Инструкция start выполнит программу до начала основной функции, то есть остановит выполнение на первой строке оператора функции main() (эта строка кода еще не была выполнена). 

Затем для отладки вы можете напрямую выполнить s или n. 

(3) Перечислите код

Перечислите 10 строк кода, начиная со строки n:

l/list n

 Начиная со строки 1, перечислите 10 строк кода:

 Продолжайте вводить l, и приведенный выше код продолжит отображаться. Например, ниже отображаются строки 11–20 и 21–20:

(4)b Установить точку останова

 Точка останова в строке n:

b n

 Точка останова в строке 23:

Этот шаг эквивалентен F9 в VS. 

Введите r для запуска, и он остановится на строке 23:

 Это эквивалентно F5 в VS.

Если вы поместите точку останова на имя функции, вы фактически поставите точку останова на первую строку содержимого функции:

(5) отключить отключить точки останова

Используйте команду Disable, чтобы отключить точки останова. Используйте следующую команду, чтобы отключить точки останова:

disable 断点编号

 Таким образом, точка останова под номером 2 отключена, и обнаруживается, что отключение электроэнергии только отключено, но точка останова все еще существует: 

(6) delete удаляет точку останова

Если вам больше не нужна точка останова, вы можете использовать команду delete, чтобы удалить точку останова:

Удалить точку останова:

delete 编号

Удалить все точки останова:

delete

(7) info b для просмотра информации о точке останова.

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

info b/break

 Просмотрите информацию о точке останова исполняемой программы InsertSort:

(8) s выполняется оператор за оператором

Пройдите по коду: 

s/step

 Выполните код основной функции, выполните строку 45, затем выполните строку 46, а затем введите функцию InsertSort для внутреннего выполнения. Если встретится точка останова, она остановится:

Эквивалент F11 VS. 

(9) n попроцессное выполнение

Выполняем пошагово:

n/next

Выполните код основной функции и непосредственно выполните основную функцию. Он не будет входить в подфункции в основной в середине. Он остановится, когда встретит точку останова: 

 Если строка 23 установлена ​​как точка останова, выполнение остановится в точке останова:

Эквивалент F10 от VS.

(10) отображение отслеживания значений переменных

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

dispaly 变量名

Например, отслеживание значения переменной temp: 

 Вы также можете проверить его адрес:

(11) undisplay отменяет отслеживание и отображает значения переменных.

Каждой переменной, использующей отображение, система присвоит номер. Если вы не хотите отображать значение переменной, вы можете использовать следующую команду:

undisplay 编号

 Если вы хотите отменить отслеживание и отобразить все переменные, вы можете использовать это напрямую:

undisplay

(12) завершить функцию выхода

 Если вы хотите выйти из функции, например, если вы подтвердили, что ошибки нет в функции, вы можете использовать Finish для выхода из функции:

finish

(13) информация для проверки того, какие точки останова установлены в данный момент.

 Используйте команду info, чтобы увидеть, какие точки останова установлены в данный момент:

i/info b

Покажите, какие точки останова установлены в данный момент: 

(14) continue позволяет функции выполняться от текущей позиции до следующей точки останова.

Выполнять программу непрерывно вместо перехода с текущей позиции: 

c/continue

Сначала запустите первую точку останова, выполните c из первой точки останова, а затем запустите вторую точку останова: 

(15) До перехода на определенную строку

Выполните непосредственно до n-й строки внутри функции:

until n

Выполните непосредственно со строки 45 по строку 47:

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

(16) стек вызовов bt

Вы можете использовать следующую команду для просмотра кадра стека вызова функции:

bt

 Просмотрите стек вызовов при выполнении текущей строки кода:

 5. сделать/Makefile

1. Понимание make/Makefile 

(1)сделать 

        make — это командный инструмент, который интерпретирует инструкции в make-файлах. Исходные файлы в проекте не учитываются и размещаются в нескольких каталогах по типу, функции и модулю.

(2)Makefile 

        Makefile — это инструмент автоматической сборки проектов Linux.Правила Makefile определяют ряд правил, определяющих, какие файлы необходимо скомпилировать в первую очередь, какие файлы необходимо скомпилировать позже, какие файлы необходимо перекомпилировать, а также выполнить еще более сложные функциональные операции. Организация компиляции называется сборкой. Все правила сборки записаны в Makefile.Чтобы научиться создавать команды, вы должны научиться писать Makefile. Преимущество make-файла - "автоматическая компиляция". После его написания требуется только одна команда make, и весь проект полностью автоматически компилируется, что значительно повышает эффективность разработки программного обеспечения. Makefile стал методом компиляции в инженерии. .

        Make — это команда, а makefile — файл.Они используются вместе для формирования исполняемой программы для завершения автоматизированного построения проекта.

2. Как написать Makefile

 Создайте Makefile на том же уровне, что и исходный файл:

 Напишите команду для компиляции InsertSort.c в Makefile. Среди них первая строка называется отношением зависимости, а вторая строка называется методом зависимости:

InsertSort:InsertSort.c       #依赖关系
        gcc InsertSort.c -o InsertSort -std=c99     #依赖方法

 InsertSort, начиная с первой строки, называется целью, InsertSort.c называется предварительным условием, gcc InsertSort.c -o InsertSort -std=c99 — это команда, а перед командой стоит клавиша Tab:

После выполнения команды make команды в Makefile будут автоматически выполнены:

 Но если вы захотите сделать это снова в это время, вы обнаружите, что make не разрешен:

 Потому что исполняемый файл уже обновлен. Целью Makefile по умолчанию является файл. Если целью является не реальный файл, а команда, то эта цель является псевдоцелью. Псевдоцель не имеет зависимостей, только зависимые методы. Следующая очистка является псевдоцелью, и make не будет проверять наличие файла с именем clean, а будет выполнять соответствующую команду при каждом его запуске:

InsertSort:InsertSort.c
        gcc InsertSort.c -o InsertSort -std=c99
.PHONY:clean      #伪目标
clean:
        rm -f InsertSort

в:

 Когда make сканирует Makefile, по умолчанию будет сформирована только одна целевая зависимость, обычно первая. Следовательно, выполнение make now не достигнет цели удаления исполняемого файла InsertSort, поскольку make сгенерирует первую цель, которая является сгенерированным Исполняемая программа InsertSort:

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

 Поменяв порядок двух целей, вы обнаружите, что команда clean выполняется первой при выполнении make:

Теперь, когда вы делаете напрямую, он не будет компилировать и генерировать исполняемый файл, а выполнять команду очистки. Если вы хотите сгенерировать исполняемую программу, вы должны выполнить make и добавить цель:

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

 6. Апплет индикатора выполнения

1. Возврат каретки и перевод строки

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

 Например, в следующем коде после печати вам нужно подождать 3 секунды перед завершением программы:

Enter.c

#include<stdio.h>

int main()
{
        printf("33333333\n");
        sleep(3);

        return 0;
}

 Makefile

enter:enter.c
        gcc -o $@ $^
.PHONY:clean
clean:
        rm -f enter

Затем напечатанное содержимое появится на экране на 3 секунды до завершения программы:

 Если вы не добавите \n, строка не будет напечатана в начале, а строка будет напечатана после ожидания в течение 3 секунд:

 

 Результаты работы этих двух программ не означают, что Sleep выполняется до printf. На самом деле, printf просто выполняется, но данные не обновляются на дисплее немедленно. Если \n отсутствует, строка будет временно сохранена в пользовательском буфере уровня языка C. Стратегия обновления устройства отображения — обновление строки (\n), что означает немедленное обновление.

Если вы хотите немедленно обновить данные без \n, вы можете вызвать интерфейс fflush, но параметром fflush является файловый поток:

Итак, какие параметры для этой программы следует передать в fflush?

Благодаря файловым операциям на языке C, система поможет нам открыть соответствующий файл на языке C по умолчанию и откроет по умолчанию 3 потока ввода и вывода:

 Почему программа по умолчанию открывает 3 потока ввода и вывода? Потому что для того, чтобы помочь нам вычислить данные, в программе есть источники данных и результаты данных.Чтобы избежать проблем, язык C по умолчанию открывает для нас эти три потока ввода и вывода, чтобы мы могли читать и писать.

В программе, которая сейчас работает, если мы хотим, чтобы код был немедленно обновлен, мы используем функцию fflush. Поскольку printf печатает на стандартный вывод, обновление также обновляется на стандартный вывод, поэтому стандартный вывод используется в качестве параметра fflush:

Если вы выполните make clean;make еще раз, вы обнаружите, что строка сначала обновляется, но для завершения программы требуется еще 3 секунды:

 Для \r используется только возврат каретки, строка остаётся неизменной, а столбец возвращается в начало текущей строки. Поскольку \n отсутствует, результат печати каждого цикла не будет отображаться:

#include<stdio.h>

int main()
{
        int count  = 5;
        while(count)
        {
                printf("%d\r",count);
                count--;
                sleep(1);
        }

        return 0;
}

Затем, чтобы отобразить результаты печати, вы можете использовать fflush:

Но результат становится обратным отсчетом в этой позиции:

 

 Если count инициализирован значением 10, результат выполнения будет еще более возмутительным:

 Это связано с тем, что монитор является символьным устройством: все, что отображается на мониторе, является символом, и все, что читается с клавиатуры, также является символом. Таким образом, первое напечатанное значение счетчика 10 выше — это не число 10, а символ «1» и символ «0». При использовании count-- значение count имеет только один символ, например 9, поэтому оно может охватывать только один символ, поэтому символ «0» никогда не будет перемещен. Чтобы решить эту проблему, вы можете вывести 2 символа, которые перезапишут символ «0»:

 Результаты:

 

2. Внедрить апплет индикатора выполнения 

Если вы реализуете апплет индикатора выполнения и печатаете «#» в той же строке, при каждом обновлении будет печататься еще один «#». Следующий код невозможно реализовать, поскольку отображение обновляется строками, а индикатор выполнения не может быть реализован. обновиться без \n:

#include<stdio.h>
#include<string.h>
#include<unistd.h>

#define NUM 100

int main()
{
        char bar[NUM+1];
        memset(bar,'\0',sizeof(bar));

        int i = 0;
        while(i <= 200)
        {
                printf("%s",bar);//没有\n,在显示器上显示不出来‘#’
                bar[i] = '#';
                i++;
                sleep(1);
        }

        return 0;
}

Так что же произойдет после добавления \n? Хотя «#» можно напечатать, при печати «#» не отображается в той же строке, что не соответствует нашим требованиям: 

 

 Поэтому рассмотрите возможность использования fflush:

 Однако я обнаружил, что в результате каждые 1 секунду автоматически печатаются еще n символов #:

 Это не соответствует нашим потребностям, нам нужно каждый раз добавлять «#». Вы можете добавить \r

Теперь каждое обновление добавляет #":

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

Теперь это быстрее:

 Однако верхний предел i равен 200. Программе требуется много времени, чтобы увидеть окончательный результат выполнения, и экран обновляется, что трудно заметить. Измените верхний предел i на 20:

 Результаты выполнения показывают, что после завершения выполнения приглашение [delia@VM-8-17-centos ProgressBar]$ и индикатор выполнения находятся на одной строке:

 Можете ли вы удалить подсказку? Вы можете перенести строку в конце выполнения программы:

 Теперь программа заканчивается новой строкой:

 Что делать, если вы хотите, чтобы индикатор выполнения был заключен в [ ]?

 Обнаружено, что индикатор выполнения отображается справа налево:

Добавьте '-' для отображения слева направо:

 Результаты выполнения следующие:

 Хотите добавить числовой процент?

 

 Результаты выполнения следующие:

 Хотите добавить вращение курсора в конце?

Результаты выполнения следующие:

 

 Что делать, если вы хотите изменить цвет индикатора выполнения? Например, измените его на зеленый:

Результаты выполнения следующие: 

 Хорошо, индикатор выполнения готов. Полный фрагмент кода:

#include<stdio.h>
#include<string.h>
#include<unistd.h>

#define NUM 100

int main()
{
        char bar[NUM+1];
        memset(bar,'\0',sizeof(bar));

        const char *token = "|/-\\";

        int i = 0;
        while(i <= 100)
        {
                printf("\033[32m[%-100s][%d%%] [%c]\r",bar,i,token[i%4]);
                fflush(stdout);
                bar[i] = '#';
                i++;
                usleep(50000);
        }

        printf("\n");
        return 0;
}

Supongo que te gusta

Origin blog.csdn.net/gx714433461/article/details/127277916
Recomendado
Clasificación